Spring Bean初始化的底层原理
在初始化Spring 容器,即new AnnotationConfigApplicationContext()之后就已经完成了spring bean的初始化(创建和注入依赖)。初始化过程中,会为每一个初始化的bean创建一个beanDefinition(描述该bean的实例,包括属性值、构造方法参数值、类信息等等),所有的beanDefinition都存在一个map里。具体过程如下:
1、进入refresh()之后,有一个finishBeanFactoryInitialization(beanFactory)的方法,在该方法里完成spring bean的实例化过程和生命周期。
2、进入finishBeanFactoryInitialization()方法,里边有一个beanFactory.preInstantiateSingletons()方法,在该方法里完成所有非懒加载的单例bean的实例化。
(懒加载:当AnnotationConfigApplicationContext容器启动时,该bean不会初始化,而是当需要使用这个类的时候才会创建实例,但如果该懒加载的bean被不是一个懒加载的bean所依赖时,那么在容器启动时,即使它是懒加载 的,也会被实例化。)
3、进入getBean()方法,判断该bean是否在spring单例池中,若在,通过getSingleton(beanName)方法直接拿。
(singletonFactoris工厂里存放的是objectFactory,每次从该工厂获取objectFactory都会消耗一定的性能,所以循环依赖获取注入的对象时,会先从三级缓存拿,三级缓存没有才去二级缓存,并且取出来之后会放到三级缓存里,同时清除二级缓存里的)
4、若不在,createbean()方法会调用doCreateBean()方法创建bean的实例,同时放入singletonFactories。
到这里,spring bean的初始化基本结束。这么复杂的过程竟然是在一行这么简单的代码里完成的: