Spring bean的建模对象----BeanDefinition
在Spring的容器中,建模一个对象,不单单是实例化出来Class,因为还需要Bean的作用域,Bean的模型注入,是否懒加载等信息。Class是无法抽象出来的。所以需要BeanDefinition类来抽象出这些信息。
SpringBean的实例化的过程(Spring是跟着路神的讲解学的,图片也是盗用路神的
链接:https://me.csdn.net/java_lyvee)
在Spring中有几个不同类型的BeanDefinition来存储Spring中扫描出来的类信息,各种的BeanDefinition的关系图如下:
BeanDefinition:
接口,BD的顶级类。有抽象实现类AbstractBeanDefinition和三个具体的实现子类GenericBeanDefinition、RootBeanDefinition、ChildBeanDefinition
GenericBeanDefinition:
从spring 2.5 开始,提供了一个更好的注册bean definition类GenericBeanDefinition,它支持动态定义父依赖,方法是GenericBeanDefinition.setParentName(java.lang.String),GenericBeanDefinition可以有效的替代ChildBeanDefinition的绝大分部使用场合。所以ChildBeanDefinition几乎被弃用。
RootBeanDefinition
一个RootBeanDefinition定义表明它是一个可合并的bean definition:即在spring beanFactory运行期间,可以返回一个特定的bean。RootBeanDefinition可以作为一个重要的通用的bean definition 视图。
RootBeanDefinition用来在配置阶段进行注册bean definition。然后,从spring 2.5后,编写注册bean definition有了更好的的方法:GenericBeanDefinition。GenericBeanDefinition支持动态定义父类依赖,而非硬编码作为root bean definition。在Spring执行Bean的实例化的阶段的过程中第三次调用了后置处理器的时候就是子类GenericBeanDefinition向上合并为RootBeanDefinition。
ChildBeanDefinition
ChildBeanDefinition是一种bean definition,它可以继承它父类的设置,即ChildBeanDefinition对RootBeanDefinition有一定的依赖关系。
ChildBeanDefinition从父类继承构造参数值,属性值并可以重写父类的方法,同时也可以增加新的属性或者方法。(很少使用)
AnnotatedGenericBeanDefinition
继承了GenericBeanDefinition 用来处理注解类,注册为BeanDefinition,在使用了AnnotationConfigApplicationContext启动Spring并且使用AppConfig做为注册类的时候,是使用AnnotatedGenericBeanDefinition来保存AppConfig的内容。所以在获取扫描路径的时候,可以根据AnnotatedGenericBeanDefinition找到该全配置类。
ScannedGenericBeanDefinition
继承了GenericBeanDefinition来处理注解扫描出来的类,注册为BeanDefinition,在Spring启动之后,根据AppConfig提供的路径来扫描出对应的类文件做解析之后,使用ScannedGenericBeanDefinition保存被解析类的具体的内容。