注册Bean
1.注册bean包括bean信息解析,容器创建,注册bean到容器中三部分
2.bean信息解析,会将xml,注解,配置类等信息转换为BeanDefinition,加入到Bean工厂
3.这部分我们重点关注的是BeanFactoryPostProcessor,这是spring容器留给我们扩展用的,
在容器初始化之前可以添加我们自定义的一些东西,最常见的就是添加bean的注册信息.
4.这部分会提前初始化BeanFactoryPostProcessor和BeanPostProcessor,BeanPostProcessor用于干预
后期的bean初始化创建
BeanFactoryPostProcessor继承图
一般我们更关注BeanFactoryPostProcessor子接口BeanDefinitionRegistryPostProcessor暴露的方法 直接添加我们需要注册的bean定义信息BeanDefinition,BeanFactoryPostProcessor主要干预bean工厂注册
初始化Bean
1.初始化单例bean分为创建原始bean,进行依赖注入(执行beanFactoryProcessor依赖注入方法),实例创建完成进行初始化(执行beanFactoryProcessor初始化方法)
2.创建原始对象很简单,只是使用反射调用无参构造方法即可
3.进行依赖注入,就是给属性赋值,并且解决了基本的循环依赖问题
4.实例创建完成进行初始化,执行beanPostProcessor的相关初始化方法,postProcessBeforeInitialization
postProcessAfterInitialization,InitializingBean的afterPropertiesSet方法
BeanPostProcessor继承图
BeanPostProcessor一般干预bean的创建过程,比如bean的属性注入,依赖,初始化,aop等实现,可以多关注 PostProcessor子接口,一些集成spring的框架多会进行干预创建过程,达到获取一个预期bean
值得关注的PostProcessor
BeanFactoryPostProcessor
1.ConfigurationClassPostProcessor内置,用于解析配置类,帮助注册bean
BeanPostProcessor
1.AutowiredAnnotationBeanPostProcessor内置,用于进行依赖注入属性(IOC)
2.ApplicationContextAwareProcessor内置,用于回调实现了Aware接口,注入
某些对象
3.AspectJAwareAdvisorAutoProxyCreator整合,用于实现aop
spring解决循环依赖原理
原理:
1.getBean创建一个对象的流程是,先使用无参构造器创建一个对象,然后注入依赖,最后初始化
2.创建完成一个原始对象,马上将对象的引用暴漏出来,调用getSingleton就能返回这个bean了
3.创建完原始对象,马上暴漏引用,退出getBean递归调用
举例:
1.首先创建对象a,通过初始化一个原始bean
2.假设a对象注入一个b对象,b对象也注入一个a对象
3.a对象创建完成,马上暴漏引用到三级缓存(这个时候属性b还是null)
4.开始装配a对象的属性b,于是递归调用getBean(b),初始化b对象完成,
马上暴漏引用到三级缓存(这个时候属性a还是null)
5.开始装配b对象的属性a,于是递归调用getBean(a),发现在getSingleton(a)
找到a的引用,b对象装配完毕,b对象创建完成
6.继续回到装配对象a的属性b, a对象的属性b装配完成,a对象创建完成
总结
可以看到,整个流程围绕 BeanFactoryPostProcessor注册bean,getBean配合BeanPostProcessor初始化 和增强bean实例,来完成整个容器的依赖注入(IOC);同时如果整合了aop,那么会注册AspectJAwareAdvisorAutoProxyCreator类型的BeanPostProcessor,对bean进行增强,来实现aop功能。