【Spring】Bean的生命周期,部分源码解释
文章目录
- Bean 的生命周期
- 执行流程
- 代码演示
- 执行结果
- 源码阅读
- AbstractAutowireCapableBeanFactory
- doCreateBean
- initializeBean
Bean 的生命周期
生命周期指的是一个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做一个对象的声明周期
Bean
的声明周期分为以下 5 个部分:
- 实例化(为
Bean
分配空间) - 属性赋值(
Bean
注入和装配,比如@Autowired
) - 初始化
- 执行各种通知,如
BeanNameAware
,BeanFactoryAware
,ApplicationContextAware
的接口方法 - 执行初始化方法
xml
定义init-method
- 使用注解的方式
@PostConstruct
- 执行初始化后置方法(
BeanPostProcessor
)
- 执行各种通知,如
- 使用
Bean
- 销毁
Bean
- 销毁容器的各种方法,如
@PreDestory
,DisposableBean
接口方法,destory-method
- 销毁容器的各种方法,如
执行流程
- 实例化和属性赋值对应构造方法和
setter
方法的注入。- 初始化和销毁是用户能自定义扩展的两个阶段
- 可以在实例化之后,类加载完成之前进行自定义“事件”处理
比如我们现在需要买一栋房子,那么我们的流程是这样的
- 先买房(实例化,从无到有)
- 装修(设置属性)
- 买家电,如洗衣机,冰箱,电视,空调等([各种]初始化,可以注入)
- 入住(使用
Bean
)- 卖房(
Bean
销毁)
执行流程如下图所示:
代码演示
@Component
public class BeanLifeComponent implements BeanNameAware { private UserComponent userComponent; public BeanLifeComponent() { System.out.println("执行构造函数"); } public void setUserComponent(UserComponent userComponent) { System.out.println("设置属性 userComponent"); this.userComponent = userComponent; } @Override public void setBeanName(String s) { System.out.println("执行了 setBeanName 方法:" + s); } /** * 初始化 */ @PostConstruct public void postConstruct() { System.out.println("执行 postConstruct()"); } public void use() { System.out.println("执行了 use 方法"); } /** * 销毁前执行方法 */ public void preDestroy() { System.out.println("执行:preDestroy()"); }
}
执行结果
通过运行结果观察:
- 先执行构造函数
- 设置属性
Bean
初始化- 使用
Bean
- 销毁
Bean
源码阅读
以上步骤在源码中皆有体现
AbstractAutowireCapableBeanFactory
创建 Bean
的代码入口在 AbstractAutowireCapableBeanFactory#createBean
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {protected Object createBean(String beanName, RootBeanDefinition mbd,@Nullable Object[] args) throws BeanCreationException {//...代码省略try {// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.// 在实例化之前,是否有快捷创建的Bean,也就是通过 PostProcessorsBeforeInstantiation返回的Bean// 如果存在,则会替代原来正常通过target bean生成的bean的流程Object bean = resolveBeforeInstantiation(beanName, mbdToUse);if (bean != null) {return bean;}}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(),beanName,"BeanPostProcessor before instantiation of bean failed", ex);}try {// 创建Bean// 方法中包含了实例化、属性赋值、初始化过程Object beanInstance = doCreateBean(beanName, mbdToUse, args);if (logger.isTraceEnabled()) {logger.trace("Finished creating instance of bean '" + beanName + "'!");}return beanInstance;}//...代码省略}
}
doCreateBean
点进去继续看源码:doCreateBean#createBean
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.if (instanceWrapper == null) {// 1. 实例化阶段:通过反射调用构造函数/工厂方法instanceWrapper = createBeanInstance(beanName, mbd, args);}// Initialize the bean instance.Object exposedObject = bean;try {// 2. 属性填充阶段:依赖注入(@Autowired/@Value等)populateBean(beanName, mbd, instanceWrapper);// 3. 初始化阶段:Aware接口回调、init-method、PostProcessor处理exposedObject = initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {// 4. 异常处理:区分是否已标记为BeanCreationExceptionif (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {throw (BeanCreationException) ex;}else {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);}}return exposedObject;
}
这三个方法与三个生命周期阶段一一对应
createBeanInstance()
->实例化populateBean()
->属性赋值initializeBean()
->初始化
initializeBean
继续点进去:initializeBean
// 初始化 Bean
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { this.invokeAwareMethods(beanName, bean); Object wrappedBean = bean; if (mbd == null || !mbd.isSynthetic()) { wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName); } try { this.invokeInitMethods(beanName, wrappedBean, mbd); } catch (Throwable ex) { throw new BeanCreationException(mbd != null ? mbd.getResourceDescription() : null, beanName, ex.getMessage(), ex); } if (mbd == null || !mbd.isSynthetic()) { wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } return wrappedBean;
}
// 调用的三个 Bean 开头的 Aware 方法
private void invokeAwareMethods(String beanName, Object bean) { if (bean instanceof Aware) { if (bean instanceof BeanNameAware) { BeanNameAware beanNameAware = (BeanNameAware)bean; beanNameAware.setBeanName(beanName); } if (bean instanceof BeanClassLoaderAware) { BeanClassLoaderAware beanClassLoaderAware = (BeanClassLoaderAware)bean; ClassLoader bcl = this.getBeanClassLoader(); if (bcl != null) { beanClassLoaderAware.setBeanClassLoader(bcl); } } if (bean instanceof BeanFactoryAware) { BeanFactoryAware beanFactoryAware = (BeanFactoryAware)bean; beanFactoryAware.setBeanFactory(this); } } }