# 附:Spring 中核心方法简介

# BeanDefinition

简介

BeanDefinition在 spring 中贯穿始终,spring 要根据 BeanDefinition 对象来实例化 bean,只要把解析的标签,扫描的注解类封装成 BeanDefinition 对象,spring 才能实例化 bean。Bean的创建工厂BeanFactory有个默认实现类DefaultListableBeanFactory,内部有个存放所有注入bean对象信息的Map。

BeanDefinition存储在Map中,key为beanName,value为BeanDefinition

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

# BeanDefinition的UML图

BeanDefinition 的三个实现类

  • ChildBeanDefinition
  • GenericBeanDefinition
  • RootBeanDefinition

注意

从 spring 2.5 开始,提供了一个更好的注册 bean definition 类GenericBeanDefinition,它支持动态定义父依赖,方法是GenericBeanDefinition.setParentName(java.lang.String),GenericBeanDefinition可以有效的替代ChildBeanDefinition的绝大分部使用场合。

# BeanDefinition的属性

  • id:Bean 的唯一标识名。它必须是合法的 XMLID,在整个XML 文档中唯一。

  • name:用来为 id 创建一个或多个别名。它可以是任意的字母符合。多个别名之间用逗号或空格分开。

  • class: 用来定义类的全限定名(包名+类名)。只有子类 Bean 不用定义该属性。

  • parent:子类Bean 定义它所引用它的父类 Bean。这时前面的 class 属性失效。子类 Bean 会继承父类 Bean 的所有属性,子类 Bean 也可以覆盖父类 Bean 的属性。注意:子类 Bean 和父类 Bean 是同一个 Java 类。

  • abstract(默认为"false"):用来定义 Bean 是否为抽象 Bean。它表示这个 Bean 将不会被实例化,一般用于父类 Bean,因为父类 Bean 主要是供子类 Bean 继承使用。

  • lazy-init(默认为"default"):用来定义这个 Bean 是否实现懒初始化。如果为true,它将在 BeanFactory 启动时初始化所有的 SingletonBean。反之,如果为false,它只在 Bean 请求时才开始创建 SingletonBean。

  • autowire(自动装配,默认为"default"):它定义了Bean 的自动装载方式。

    • no: 不使用自动装配功能。
    • byName: 通过Bean 的属性名实现自动装配。
    • byType:通过 Bean 的类型实现自动装配。
    • constructor:类似于 byType,但它是用于构造函数的参数的自动组装。
    • autodetect:通过Bean 类的反省机制(introspection)决定是使用constructor还是使用byType
  • depends-on(依赖对象):这个 Bean 在初始化时依赖的对象,这个对象会在这个Bean 初始化之前创建。

  • init-method:用来定义 Bean 的初始化方法,它会在Bean 组装之后调用。它必须是一个无参数的方法。

  • destroy-method:用来定义 Bean 的销毁方法,它在 BeanFactory 关闭时调用。同样,它也必须是一个无参数的方法。它只能应用于 singletonBean。

  • factory-method:定义创建该Bean 对象的工厂方法。它用于下面的factory-bean,表示这个 Bean 是通过工厂方法创建。此时,“class”属性失效。

  • factory-bean: 定义创建该 Bean 对象的工厂类。如果使用了factory-beanclass属性失效。

  • autowire-candidate:采用 xml 格式配置 bean 时,将<bean/>元素的 autowire-candidate 属性设置为 false,这样容器在查找自动装配对象时,将不考虑该 bean,即它不会被考虑作为其它 bean 自动装配的候选者,但是该 bean 本身还是可以使用自动装配来注入其它 bean 的。

  • MutablePropertyValues:用于封装<property>标签的信息,其实类里面就是有一个list,list 里面是 PropertyValue 对象,PropertyValue 就是一个name 和 value 属性,用于封装<property>标签的名称和值信息

  • ConstructorArgumentValues:用于封装<constructor-arg>标签的信息,其实类里面就是有一个 map,map 中用构造函数的参数顺序作为key,值作为 value 存储到 map 中

  • MethodOverrides:用于封装 lookup-method 和 replaced-method 标签的信息,同样的类里面有一个 Set 对象添加 LookupOverride 对象和 ReplaceOverride 对象

# ChildBeanDefinition

简介

ChildBeanDefinition是一种 bean definition,它可以继承它父类的设置,即ChildBeanDefinition 对 RootBeanDefinition 有一定的依赖关系。ChildBeanDefinition 从父类继承构造参数值,属性值并可以重写父类的方法,同时也可以增加新的属性或者方法。(类同于 java 类的继承关系)。若指定初始化方法,销毁方法或者静态工厂方法,ChildBeanDefinition 将重写相应父类的设置。depends on,autowire mode,dependency check,sigleton,lazy init 一般由子类自行设定。

# GenericBeanDefinition

简介

GenericBeanDefinition是一站式的标准 bean definition,除了具有指定类、可选的构造参数值和属性参数这些其它 bean definition 一样的特性外,它还具有通过 parenetName 属性来灵活设置 parent bean definition。

通常, GenericBeanDefinition用来注册用户可见的 bean definition(可见的bean definition 意味着可以在该类BeanDefinition上定义post-processor 来对bean 进行操作,甚至为配置 parent name 做扩展准备)。RootBeanDefinition / ChildBeanDefinition 用来预定义具有 parent/child 关系的 bean definition。

# RootBeanDefinition

简介

一个RootBeanDefinition 定义表明它是一个可合并的 bean definition:即在spring beanFactory 运行期间,可以返回一个特定的 bean。RootBeanDefinition可以作为一个重要的通用的 bean definition 视图。

RootBeanDefinition用来在配置阶段进行注册 bean definition。然后,从 spring2.5 后,编写注册 bean definition 有了更好的的方法:GenericBeanDefinition。GenericBeanDefinition 支持动态定义父类依赖,而非硬编码作为 root bean definition。

# BeanDefinitionBuilder

简介

BeanDefinitionBuilder是Builder模式的应用。通过这个类我们可以方便的构建BeanDefinition的实例对象。


@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(OrderService.class)
                //这里的属性名是根据setter方法
                .addPropertyReference("dao", "orderDao")
                .setInitMethodName("init")
                .setScope(BeanDefinition.SCOPE_SINGLETON)
                .getBeanDefinition();

        registry.registerBeanDefinition("orderService", beanDefinition);

    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        //do nothing
    }
}

# invokeBeanFactoryPostProcessors

简介

  • BeanDefinitionRegistryPostProcessor

    • 实现PriorityOrdered接口
    • 实现Ordered接口
    • 两个接口都没实现
    • 调用BeanFactoryPostProcessor
  • BeanFactoryPostProcessor

    • 实现PriorityOrdered接口
    • 实现Ordered接口
    • 两个接口都没实现

# registerBeanPostProcessors

简介

将BeanPostProcessor类型接口注册到BeanFactory中

  • 实现PriorityOrdered接口
  • 实现Ordered接口
  • 两个接口都没实现
  • MergedBeanDefinitionPostProcessor类型的接口

PS:MergedBeanDefinitionPostProcessor类型的接口是spring内部使用接口

# onRefresh

简介

这个方法是一个很重要的方法,不同的上下文对象对其有不同的实现,在springboot中,就是通过这个方法启动了嵌入式servlet容器。

# finishBeanFactoryInitialization

简介

这个方法是spring中比较重要的方法之一,主要作用初始化所有的单例Bean(非延迟加载的)。

  • bean实例化过程
  • ioc
  • 注解支持
  • BeanPostProcessor的执行
  • Aop的入口