Spring Bean初始化的底层原理

在初始化Spring 容器,即new AnnotationConfigApplicationContext()之后就已经完成了spring bean的初始化(创建和注入依赖)。初始化过程中,会为每一个初始化的bean创建一个beanDefinition(描述该bean的实例,包括属性值、构造方法参数值、类信息等等),所有的beanDefinition都存在一个map里。具体过程如下:
Spring Bean初始化的底层原理
1、进入refresh()之后,有一个finishBeanFactoryInitialization(beanFactory)的方法,在该方法里完成spring bean的实例化过程和生命周期。

2、进入finishBeanFactoryInitialization()方法,里边有一个beanFactory.preInstantiateSingletons()方法,在该方法里完成所有非懒加载的单例bean的实例化。
(懒加载:当AnnotationConfigApplicationContext容器启动时,该bean不会初始化,而是当需要使用这个类的时候才会创建实例,但如果该懒加载的bean被不是一个懒加载的bean所依赖时,那么在容器启动时,即使它是懒加载 的,也会被实例化。)
Spring Bean初始化的底层原理
Spring Bean初始化的底层原理
3、进入getBean()方法,判断该bean是否在spring单例池中,若在,通过getSingleton(beanName)方法直接拿。
Spring Bean初始化的底层原理
Spring Bean初始化的底层原理
(singletonFactoris工厂里存放的是objectFactory,每次从该工厂获取objectFactory都会消耗一定的性能,所以循环依赖获取注入的对象时,会先从三级缓存拿,三级缓存没有才去二级缓存,并且取出来之后会放到三级缓存里,同时清除二级缓存里的)

4、若不在,createbean()方法会调用doCreateBean()方法创建bean的实例,同时放入singletonFactories。
Spring Bean初始化的底层原理
Spring Bean初始化的底层原理
到这里,spring bean的初始化基本结束。这么复杂的过程竟然是在一行这么简单的代码里完成的:
Spring Bean初始化的底层原理

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-09-08
  • 2022-01-11
  • 2021-11-01
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-19
  • 2021-08-17
  • 2022-12-23
  • 2022-01-02
  • 2022-01-27
  • 2021-10-16
  • 2021-12-12
相关资源
相似解决方案