Bean信息定义有4中方式
API方式:
是通过实现BeanDefinition接口的方式,具体的实现类有5种:
直接实例化即可。
Xml方式:
最终也会通过XmlBeanDefinitionReader类解析成API的配置方式
Properties文件方式:
employee.(class)=MyClass // 等同于:
employee.(abstract)=true // 等同于:
employee.group=Insurance // 为属性设置值,等同于:
employee.usesDialUp=false // 为employee这个bean中的usesDialUp属性设置值,等同于:等同于:
最终也会通过 PropertiesBeanDefinitionReader类解析成API的配置方式
注解方式:
@bean或@Compontent最终也会解析成API的配置方式
元信息解析主要有3中方式:
bean注册接口:BeanDefinitionRegistry (继承了AliasRegistry
)
别名注册接口:AliasRegistry
bean定义可能存在多级的父子关系,递归合并成一个包含完整信息的RootBeanDefinition。
合并处的源码如下:
之后的阶段将使用这个RootBeanDefinition,下一步将检查是否需要加载依赖Bean,没有则跳过(图未截取全)
将bean的class名称转换为Class类型的对象。
源码如下:
具体的resolveBeanClass方法,往下深入,可以看到最终是通过Class.forName获取的类对象
有了类对象下面就可以开始通过反射进行实例化了
会执行实现了BeanPostProcesstor接口的类的postProcessBeforeInitialization方法。
源码如下:
可以看出,如果返回了Bean,则spring就会直接使用此bean,而跳过下面创建bean的操作了(这是spring的一个扩展点)
这个过程会通过反射来调用bean的构造器来创建bean的实例,最后包装成BeanWrapper。(使用了装饰器模式)
源码如下:
这里使用了策略模式,在SimpleInstantiationStrategy类中处理
最后在BeanUtils类的InstantiateClass方法中调用的类的newInstance方法(核心)
后置处理类进行一些缓存处理,方便后面使用
主要是对实现了MergedBeanDefinitionPostProcessor这个接口的类进行回调处理,实现类主要包括:
spring会调用实现了InstantiationAwareBeanPostProcessor接口的类的postProcessAfterInstantiation方法
如果返回false,则后面的两步属性赋值就会跳过。所以可以用来阻止属性赋值
主要是通过@Autowire等注解生成属性的值,以便后面进行赋值
可以看出当postProcessProperties和postProcessPropertyValues都返回空时,表示此bean不需要设置属性,直接返回,进入下一阶段。
PropertyValues中保存了bean实例对象中所有属性值的设置,所以我们可以在这个postProcessProperties中对PropertyValues值进行修改
InstantiationAwareBeanPostProcessor的实现类如下:
最关键是这两个实现类值的注入操作:
循环处理PropertyValues
中的属性值信息,通过反射调用set方法将属性的值设置到bean实例中。
九曲十八弯之后,最终调用的是BeanWrapperImpl的setValue方法中通过反射为字段赋值
spring会调用实现了BeanPostProcessor接口的实现类的postProcessBeforeInitialization方法。
实现类包括很多(没截全)
最关键的是
1、调用实现了InitializingBean接口的Bean的afterPropertiesSet方法
2、调用定义bean的时候指定的init-method初始化方法。
有三种方式指定初始化方法:
spring会调用实现了BeanPostProcessor接口的实现类的postProcessAfterInitialization方法。
为了确保所有非lazy的单例都被实例化,同时考虑到FactoryBeans
所以在全部bean初始化完成之后,spring会初始化实现了SmartInitializingSingleton接口的afterSingletonsInstantiated方法。
也包括BeanFactory自身。
带有ApplicationContext的容器,内部最终都会调用preInstantiateSingletons触发所有单例bean的初始化。
不必多说
bean的销毁有三种方式:
Bean销毁阶段会依次执行:
轮询beanPostProcessors列表,如果是DestructionAwareBeanPostProcessor这种类型的,会调用其内部的postProcessBeforeDestruction方法
如果bean实现了org.springframework.beans.factory.DisposableBean接口,会调用这个接口中的destroy方法
调用bean自定义的销毁方法
spring会调用实现了DestructionAwareBeanPostProcessor接口的类的postProcessBeforeDestruction方法
实现类如下:
最关键的是:
自定义销毁方法有3种方式:
简单bean的生命周期为: