我们先来聊聊bean的生命周期:
bean的生命周期图:
AbstractAutowireCapableBeanFactory的docreateBean()方法(简单描述):
1.可以根据源码的时候得出在docreateBean方法里面是bean生命周期的核心逻辑:
//只放了核心逻辑 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// bean初始化第一步:默认调用无参构造实例化Bean
// 构造参数依赖注入,就是发生在这一步
if (instanceWrapper == null) {
//再这个地方完成了对象的创建,推断创建构造方法 进入
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// Initialize the bean instance.
Object exposedObject = bean;
try {
// bean初始化第二步:填充属性(DI依赖注入发生在此步骤)
// 调用反射和内省去进行属性设置
// 属性值需要进行类型转换,判断属性注入是否需要
populateBean(beanName, mbd, instanceWrapper);
// bean初始化第三步:调用初始化方法,完成bean的初始化操作(AOP发生在此步骤)
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}
我们根据Bean生命周期图进行Bean生命周期的内部讲解:
详细步骤介绍:
实例化:
1:Bean的实例化调用createBeanInstance(beanName, mbd, args)方法 默认调用无参构造实例化Bean
依赖注入:
2.Bean的依赖注入 ->调用->populateBean(beanName, mbd, instanceWrapper)方法 完成 Bean 中所有属性值的配置注入,最终核心还是根据PropertyHandler的setValue()方法进行setter方法的调用(注入);
初始化:
3.检查有无Aware的相关接口设置相关依赖:
3.1.如果Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 值。
3.2.如果 Bean 实现了 BeanFactoryAware 接口,则 Spring 调用 setBeanFactory() 方法传入当前工厂实例的引用。
3.3.如果 Bean 实现了 ApplicationContextAware 接口,则 Spring 调用 setApplicationContext() 方法传入当前 ApplicationContext 实例的引用。
4.如果 BeanPostProcessor 和 Bean 关联,spring将调用它们的postProcessBeforeInitialization(Object bean, String beanName)(预初始化)方法 它作用是在Bean实例创建成功后进行增强处理(如对Bean进行修改,增加某个功能等)。
5.是否实现InitializingBean接口,如果 Bean 实现了 InitializingBean 接口,则 Spring 将调用 afterPropertiesSet() 方法 作用是在bean正式构造完成前增加我们自己自定义的逻辑(只能增加一些额外的逻辑)。
6.是否配置自定义的init方法(比如说配置文件中通过 init-method 属性指定了初始化方法),配置则执行初始化方法。
7.如果 BeanPostProcessor 和 Bean 关联,spring将调用它们的postProcessBeforeInitialization(Object bean, String beanName),(预初始化) 作用和步骤4一样,只是时机不一样,步骤4是初始化前,这是初始化后。
销毁步骤:
8.如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁
9.如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁
总结:
Bean的生命周期基本上分为4大步:
1.Bean的实例化 ->createBeanInstance()
2.Bean的属性注入(依赖注入) ->populateBean(beanName, mbd, instanceWrapper);
3.Bean的初始化: ->initializeBean(beanName, exposedObject, mbd);
4:Bean的销毁:是容器关闭时调用的,在ConfigurableApplicationContext类的close()中
Original: https://www.cnblogs.com/yunjie0930/p/15414203.html
Author: 小杰i
Title: 一文读懂Spring框架中Bean的生命周期
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/576386/
转载文章受原作者版权保护。转载请注明原作者出处!