美文网首页
3.spring 4 剖析-DefaultListableBea

3.spring 4 剖析-DefaultListableBea

作者: 雷哥AI工程化 | 来源:发表于2018-06-15 09:55 被阅读0次

前言

通过之前对BeanDefinition注册的分析,我们得知,注册的主要类是DefaultListableBeanFactory,那今天我们就分析一下DefaultListableBeanFactory的实现关系。

类图

DefaultListableBeanFactory类图

我们从上层的顶级接口开始梳理,如果想知道DefaultListableBeanFactory都可以干什么,需要知道上层的接口都定义了什么。

我们可以关注这样几个类:BeanFactory/HierarchicalBeanFactory/ListableBeanFactory/ConfigurableBeanFactory/AutowireCapableBeanFactory/AbstractBeanFactory/AbstractAutowireCapableBeanFactory

这些都梳理后,我们就可以了解了DefaultListableBeanFactory都可以干什么了。

源码分析

BeanFactory

BeanFactory类结构图

从图中,可以看出来,此接口定义了获取Bean的公众方式,以及Bean的一些基本信息判断,比如isSingleton/isPrototype/isTypeMatch

还有一个需要注意的地方,看这个常量:

String FACTORY_BEAN_PREFIX = "&";

如果我们在获取Bean的时候,使用&则获取的是FactoryBean本身对象,否则是获取getObject的代理对象。

看个例子:

public class Test {
    public static void main(String[] args) throws Exception {
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        
        beanFactory.registerBeanDefinition("springBean",new RootBeanDefinition(PersonFactoryBean.class));

        System.out.println(beanFactory.getBean("springBean"));
        System.out.println(beanFactory.getBean("&springBean"));

    }

    static class PersonFactoryBean implements FactoryBean<Person>{
        @Override
        public Person getObject() throws Exception {
            return new Person();//可以做代理操作
        }
        @Override
        public Class<?> getObjectType() {
            return Person.class;
        }
        @Override
        public boolean isSingleton() {
            return true;
        }
    }
    @Data
    static class Person {
        private String name;
    }
}

输出 :

Test.Person(name=null)
Test$PersonFactoryBean@1f5a0bc0

(关于FactoryBean,以后再来讨论,现在可以认为是一个特殊的Spring的实现方式)

HierarchicalBeanFactory

可以获取父容器的相关BeanFactory

ListableBeanFactory

BeanFactory接口定义的都是对于一个Bean的获取和判断操作,此接口则定义了批量的Bean获取和判断操作:

ListableBeanFactory类结构图

比如:

  1. getBeanDefinitionCount:获取所有BeanDefinition的个数
  2. getBeanNamesForType: 获取所有此类型的BeanName
  3. getBeanNamesForAnnotation: 获取此注解下的所有 BeanName

不一一举例了,都是对于BeanDefinition的批量操作的扩展。

ConfigurableBeanFactory

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
//代码省略
}

它拥有了HierarchicalBeanFactory和SingletonBeanRegistry(单例注册)的功能。


ConfigurableBeanFactory的类结构图分析

AutowireCapableBeanFactory

对于已存在的Bean进行装配暴露,多用于集成其他框架使用:


AutowireCapableBeanFactory的解释

ConfigurableListableBeanFactory

public interface ConfigurableListableBeanFactory
        extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
}

ConfigurableListableBeanFactory拥有了ListableBeanFactory/AutowireCapableBeanFactory/ConfigurableBeanFactory功能以外,还提供了一些扩展的功能:比如分析和修改BeanDefinition的一些功能。

AbstractBeanFactory、AbstractAutowireCapableBeanFactory

通过类图,得知,AbstractBeanFactory一定是可配置BeanFactory和注入BeanDefinition的是一个抽象模板类。
AbstractAutowireCapableBeanFactory在 AbstractBeanFactory的基础上,增加了可装配的功能(AutowireCapableBeanFactory).

当然,今天梳理的都是接口关系,和接口的能力,具体实现,之后再进行分析。

DefaultListableBeanFactory

此时再来看这个类,会清晰很多。

首先它本身就是一个BeanDefinitionRegistry,可以完成注册功能。

再次,它是一个有层次的工厂类实现,因为它实现了AutowireCapableBeanFactory,且因为它实现了很多BeanDefinition的操作功能(BeanFactory:单个Bean的操作,ListableBeanFactory:批量Bean的操作)

ok,现在我们已经对DefaultListableBeanFactory的能力进行了一个大概的梳理。

小结

对于关键的工厂类DefaultListableBeanFactory,我们进行了一个非常详细的梳理。

当然,今天不涉及具体的实现,以后可以再对实现进行研究。

相关文章

网友评论

      本文标题:3.spring 4 剖析-DefaultListableBea

      本文链接:https://www.haomeiwen.com/subject/xylpeftx.html