Bean 的生命周期概括起来就是 4 个阶段:
- 实例化(Instantiation)
- 属性赋值(Populate)
- 初始化(Initialization)
- 销毁(Destruction)
实例化
实例化Bean时要看是BeanFactory容器还是ApplicationContext容器。
1.BeanFactory容器:当向容器请求一个未初始的bean时,或初始化bean的时候需要注入注入到另一个尚未初始化的依赖时美容器就会调用creatBean来进行初始化
2.ApplicationContext容器,当容器启动结束后,便实例化所有的bean。
3.容器通过获取BeanDefinition对象中的信息进行实例化。并且这一步仅仅是简单的实例化,并未进行依赖注入
4.实例化对象被包装在BeanWrapper对象中,BeanWrapper提供了设置对象属性的接口,从而避免了使用反射机制设置属性
扫描xml文件、注释类(例:@Component)、配置类中bean的定义(@Configuration -> @Bean)
设置对象属性(依赖注入)
实例化的对象被封装在BeanWrapper对象中,并且此时对象仍然是一个原生的状态,并没有进行依赖注入
随后Spring根据BeanDefinition中的信息进行依赖注入,并且通过BeanWrapper提供的设置属性的接口完成依赖注入
注入Aware接口
随后Spring会检测该对象是否实现了xxxAware接口,并且将相关的实例注入给bean。
此时bean对象已经被正确构造。
BeanNameAware
如果bean实现此接口,spring将bean的id传给setBeanName()方法
BeanFactoryAware
如果bean实现此接口,Spring将调用setBeanFactory方法,将BeanFactory实例传过来
ApplicationContextAware
如果实现此接口,它的setApplicationContext()方法将被调用,将应用上下文的引用传入到bean中;
BeanPostProcessor
该接口提供了两个函数用来对对象在被使用前做一些自定义的处理,此时Bean会被传递进来,可以对bean做任何处理。
前置处理:在Bean实例创建
1.postProcessBeforeInitialzation( Object bean, String beanName )
2.会先于先于InitialzationBean执行,所有的Aware接口的注入就是在此完成的
后置处理:
1.postProcessAfterInitialzation( Object bean, String beanName)
InitializingBean与init-method
当前置处理完成后就会进入本阶段。
InitializingBean 和 init-method 是 Spring 为 bean 初始化提供的扩展点。
InitializingBean接口 的定义如下:
public interface InitializingBean { void afterPropertiesSet() throws Exception; }
在 afterPropertiesSet() 方法写初始化逻辑。
<bean id="student" class="com.ape.demo.Student" init-method="doInit"></bean>
DisposableBean和destroy-method
和init-method一样,通过给destroy-method指定函数,就可以在bean销毁前执行指定的逻辑。
<bean id="student" class="com.ape.demo.Student" destroy-method="doDestory"></bean>

本文详细解读Spring框架中Bean的完整生命周期,包括实例化、依赖注入、接口实现和销毁阶段,以及如何通过配置如init-method和destroy-method进行定制化操作。

1619

被折叠的 条评论
为什么被折叠?



