SpringBean的生命周期及其理解
基础回答
可以分为几个阶段,会包含比如说像加载、实例化还有销毁。
在加载和销毁的时候,我们可以去配置一些这种扩展,如init-method以及destory-method。
他会在Spring Bean的加载过程中会触发一些回调。
Spring的生命周期划分阶段
1. 创建前准备
这个阶段主要作用是Bean在开始加载之前,要从上下文和一些配置中去解析并且查找Bean有关的扩展实现。
比如说像init-method
,容器在初始化Bean的时候会调用的方法。destory-method
容器在销毁Bean的时候会调用一些方法以及BeanFactoryPostProcessor这一类的bean加载过程中的前置和后置的一些处理扩展实现。这些类或者配置其实是Spring提供给开发者用来去实现Bean加载过程中的一些扩展。
在很多的和Spring集成的中间件也比较常见。比如说像Dubbo这样一些中间件。
2. 创建实例化
主要作用是通过反射去创建Bean的实例对象,并且会扫描和解析Bean声明的一些属性。
实例化一个Bean,也就是我们常说的new。
3. IOC依赖注入
如果被实例化的Bean存在依赖其他Bean对象的一些情况。则需要对这些依赖的Bean进行对象注入。
比如常见的@Autowired以及setter注入等这样的一些配置形式,同时在这个阶段会触发一些扩展的调用。比如说常见的扩展类BeanPostProcessors用来去实现Bean初始化前后的扩展回调,以及像BeanFactoryAware等等。
按照Spring上下文对实例化的Bean进行配置,也就是IOC注入。
3.1 setBeanName实现
如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值。
3.2 BeanFactoryAware实现
如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory,setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其他Bean,只需在Spring配置文件中配置一个普通的Bean就可以)。
3.3 ApplicationContextAware实现
如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容),但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法。
3.4 postProcessBeforeInitialization接口实现-初始化预处理
如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术。
4. 容器缓存
容器缓存阶段主要的作用是把Bean保存到容器以及Spring的缓存中。到了这个阶段,bean就可以被开发者去使用了。这个阶段涉及到那些操作常见的像init-method
,这个属性配置一些方法或者这个阶段会被调用,以及像BeanPostProcessors的后置处理器方法也会在这个阶段被触发。
4.1 init-method
如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
4.2 postProcessAfterInitialization
如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法。
注:**以上工作完成以后就可以应用这个Bean了,**那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton。
5. 销毁实例
当Spring的应用上下文被关闭的时候,那么这个上下文中所有的bean会被销毁。如果存在bean实现了像DisposableBean接口或者配置了destory-method
属性的一些方法,会在这个阶段被调用。
5.1 Destroy过期自动清理阶段
当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法。
5.2 destroy-method自配置清理
最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。