Spring 通过反射来实例化Bean
bean的加载流程:
-
转化对应的beanName:去除对FactoryBean的修饰符(去除“&”)
-
尝试从缓存中加载单例(map中)
-
bean的实例化(之前获取到的bean是最原始的bean状态;如果bean继承FactroyBean,需要返回的并不是这个类对象,而是getObject()中的实例。ps:如果真的是想获取到工厂,那么传入的beanName前应该添加“&”)
-
寻找依赖(在初始化一个bean时,首先会初始化这个bean所对应的依赖)
- 循环依赖:两个或多个bean相互持有对方
- spring解决循环依赖(只有单例才有可能解决循环依赖):
- 构造器注入的循环依赖:抛出异常(BeanCurrentlyInCreatioinException)
- setter注入的循环依赖:通过提前暴露单例工厂从而使其他bean能引用到该bean
- 非单例的循环依赖:spring无法支持,抛出异常(BeanCurrentlyInCreatioinException)
-
针对不同scope进行bean的创建:
- 创建一个对象
- 如果是单例,暴露objectFactory
- 属性填充
- 是否实现Aware(获取相应的资源)
- BeanPostProcessor前置处理(后两条是对单个bean进行的处理,此部可以处理所有的bean)
- 是否实现InitializingBean,调用afterPropertiesSet方法
- 是否配置init-method
- BeanPostProcessor后置处理
- 是否实现DisposableBean
- 是否配置destroy-method
文章为参考:《Spring源码深度解析》、http://www.cnblogs.com/xrq730/p/5721366.html 后的自我总结。不对之处,望不吝赐教!