官方解释版本
找到BeanFactory接口,上面有着官方最权威的说明,其实很简单。 1.实现一堆aware接口,用于bean实例获取对应的信息:容器信息也好,工厂信息也好,环境信息也好 2.初始化之前做的一系列事情,如ApplicationContextAwareProcessor接口,会将spring上下文,环境信息等注入到对应的bean中。InitDestroyAnnotationBeanPostProcessor接口,会解析@PostConstruct和@PreDestroy生命周期注解实现对应的方法。 3.其次就是初始化过程,实现initMethod方法,如果类实现了InitializingBean接口则会实现 afterPropertiesSet方法。 4.然后是bean初始化结束后在对bean做一些操作,假如创建对应的代理对象等。 5.容器关闭后bean的消亡。执行对应的destory方法。如果实现了DisposableBean接口则会实现destory方法。
自己理解版
概述
其实spring bean的生命周期远不止官方版讲得那么简单。 首先spring是如何进行自动注入的,是如何解决循环依赖的,是如何进行aop动态代理的,其实都和spring bean的生命周期息息相关。自动注入,循环依赖,aop动态代理以后会有文章分享这里暂时不提。 针对于spring bean的生命周期,最重要的概念其实就是bean的创建分为两大步骤。
1.实例化 2.初始化
有兴趣的可以去阅读spring源码DefaultListableBeanFactory类中doCreateBean方法 实例化前后也可以做相关操作,但是做得不多。实例化主要就是调用类的无参构造实例化对象。 实例化后会调用populateBean方法注入属性,自动注入也在此方法完成。 然后再是初始化和上面一样。
为什么bean的生命周期要分2大步?
我的理解就是使bean的生命是周期更加的清晰有条理。我们都需要对bean做后续的扩展操作,spring提供了BeanPostProcessor
等接口来提供对bean的扩展操作,比如上述提到的自动注入、解决循环依赖、AOP动态代理等等。实例化前后也可以做相关操作满足不同的对bean操作的需求,分成2大步使得逻辑更加清晰,扩展点更加明确。
总结
说spring bean的生命周期不仅要说到官方版,更重要的是去理解bean的实例化和初始化过程以及实例化初始化前后都做了什么,这才是真正的spring bean的生命周期。
结尾
这是我通过阅读源码自己对于spring bean生命周期的理解,只是大致的讲了一些框架,没有非常深入,有机会的话我会写一篇spring bean生命周期的细节文章,但是扯细节的话可能又要涉及自动注入循环依赖等问题,其实更多的就是对于doCreateBean方法的详解。读者有兴趣也可阅读源码。
如果有错误之处还请各位大佬指正,非常感谢!