一、什么是BeanDefinition
BeanDefinition表示Bean定义,Spring根据BeanDefinition来创建Bean对象,BeanDefinition有很多属性来描述Bean。
1、BeanDefinition中的重要属性
a. beanClass
表示一个bean的类型,XXX.class,spring在创建Bean的过程中会根据此属性来实例化得到对象
b. scope
表示一个bean的作用域:
scope=singleton,该bean就是一个单例bean
scope=prototype,该bean就是一个原型bean,每次获得bean都会生成一个新的对象
c. isLazy
表示一个bean是不是需要懒加载,注:原型bean的isLazy属性不起作用。
懒加载的单例bean会在第一次getBean的时候生成bean,非懒加载的的单例bean会在spring启动过程中生成bean
d. dependsOn
表示一个bean在创建前所依赖的其他bean,在一个bean创建前,它所依赖的的bean得先全部创建好
e. primary
表示一个bean是主bean,在spring中一个类型可以有多个bean对象,在进行依赖注入时,如果根据类型找到了多个bean,则会判断这些bean中是否会存在一个主bean,如果存在,则直接将这个bean注入给属性
f. initMethodName
表示一个bean的初始化方法,一个bean的生命周期中有一个步骤叫做初始化,spring会在这个步骤中去调用bean的初始化方法,初始化的逻辑由程序要自己控制,表示程序员可以自定义逻辑对bean进行加工
二、什么是 BeanFactory
BeanFactory是一种“spring容器”它可以用来创建Bean、获取Bean。
BeanFactory将利用BeanDefinition生成Bean对象
BeanFactory的核心子类接口和实现类
ListableBeanFactory ConfigurableBeanFactory AutowireCapableBeanFactory AbstractBeanFactory DefaultListableBeanFactory
DefaultListableBeanFactory的功能:
支持单例Bean,Bean别名、父子BeanFactory、Bean类型转换、Bean后置处理、自动装配等等
三、Bean的生命周期
- BeanDefinition: BeanDefinition表示Bean定义、它定义了某个Bean类型、比如需要利用BeanDefinition中beanClass的属性确定Bean类型,从而实例化对象
- 构造方法推断:一个Bean中可以有多个构造方法,此时需要spring来判断用那个构造方法,之后确定一个构造方法,就可以利用构造方法来实例化得到一个对象了
- 实例化 (构造方法反射得到对象):通过构造方法反射得到一个实例化对象,在spring中可以通过BeanPostProcessor机制对实例化进行干预
- 属性填充(给输出进行自动填充):实例化得到的对象不是完整的对象、不完整的意思是该对象中的属性还没有进行填充,也就是spring还没有自动给某些属性赋值,属性填充就是通常说的依赖注入、自动注入
- 初始化(对其他属性校验、赋值):可以利用初始化机制对Bean进行自定义加工,比如利用InitializingBean接口对Bbean中的其他属性进行赋值、或对Bean中的某些属性进行校验
- 初始化后(AOP、生成代理对象):AOP机制就是在这个步骤中通过BeanPostProcessor自己实现的,初始化之后得到的对象才是真正的Bean对象