Skip to content

Bean生命周期 ​

深入理解Spring Bean的完整生命周期,掌握从实例化、属性注入、初始化到销毁的完整流程,理解各个生命周期钩子的执行时机和作用。

📋 Bean生命周期概览 ​

Spring Bean的生命周期从容器开始创建Bean到销毁Bean的完整过程,包含多个关键步骤和扩展点。

🎯 一、Bean生命周期完整流程 ​

1.1 生命周期流程图 ​

🎯 二、实例化阶段 ​

2.1 实例化流程 ​

Bean的实例化是创建Bean对象的第一个步骤。

createBeanInstance方法:

java
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd,
        @Nullable Object[] args) {
    // 1. 解析Bean的Class
    Class<?> beanClass = resolveBeanClass(mbd, beanName);
    
    // 2. 检查Bean的访问权限
    if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && 
            !mbd.isNonPublicAccessAllowed()) {
        throw new BeanCreationException(...);
    }
    
    // 3. 获取实例提供者
    Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
    if (instanceSupplier != null) {
        return obtainFromSupplier(instanceSupplier, beanName);
    }
    
    // 4. 获取工厂方法
    if (mbd.getFactoryMethodName() != null) {
        return instantiateUsingFactoryMethod(beanName, mbd, args);
    }
    
    // 5. 判断是否需要重新解析构造器(由于参数类型匹配)
    boolean resolved = false;
    boolean autowireNecessary = false;
    if (args == null) {
        synchronized (mbd.constructorArgumentLock) {
            if (mbd.resolvedConstructorOrFactoryMethod != null) {
                resolved = true;
                autowireNecessary = mbd.constructorArgumentsResolved;
            }
        }
    }
    if (resolved) {
        if (autowireNecessary) {
            return autowireConstructor(beanName, mbd, null, null);
        }
        else {
            return instantiateBean(beanName, mbd);
        }
    }
    
    // 6. 自动装配构造器
    Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(
            beanClass, beanName);
    if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
            mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
        return autowireConstructor(beanName, mbd, ctors, args);
    }
    
    // 7. 使用默认构造器
    ctors = mbd.getPreferredConstructors();
    if (ctors != null) {
        return autowireConstructor(beanName, mbd, ctors, null);
    }
    
    // 8. 使用无参构造器实例化
    return instantiateBean(beanName, mbd);
}

实例化方式:

  1. Supplier方式:通过Supplier接口实例化
  2. 工厂方法:通过静态工厂方法或实例工厂方法
  3. 构造器注入:通过有参构造器(自动装配)
  4. 默认构造器:使用无参构造器

2.2 构造器选择 ​

Spring会根据以下规则选择构造器:

  • @Autowired注解的构造器:优先选择
  • 参数匹配的构造器:如果只有一个构造器,使用该构造器
  • 参数数量最多的构造器:如果有多个构造器,优先选择参数最多的
  • 默认构造器:如果没有匹配的构造器,使用默认构造器

🎯 三、属性注入阶段 ​

3.1 属性注入流程 ​

属性注入在Bean实例化之后进行,包括依赖注入和属性赋值。

populateBean方法:

java
protected void populateBean(String beanName, RootBeanDefinition mbd,
        @Nullable BeanWrapper bw) {
    // 1. 如果BeanWrapper为空,检查是否有属性值
    if (bw == null) {
        if (mbd.hasPropertyValues()) {
            throw new BeanCreationException(...);
        }
        else {
            return;
        }
    }
    
    // 2. 给InstantiationAwareBeanPostProcessor一个机会修改属性值
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
                InstantiationAwareBeanPostProcessor ibp = 
                        (InstantiationAwareBeanPostProcessor) bp;
                PropertyValues pvsToUse = ibp.postProcessProperties(pvs, 
                        bw.getWrappedInstance(), beanName);
                if (pvsToUse == null) {
                    if (filteredPds == null) {
                        filteredPds = filterPropertyDescriptorsForDependencyCheck(
                                bw, mbd.allowCaching);
                    }
                    pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, 
                            bw.getWrappedInstance(), beanName);
                    if (pvsToUse == null) {
                        return;
                    }
                }
                pvs = pvsToUse;
            }
        }
    }
    
    // 3. 检查是否需要依赖检查
    boolean needsDepCheck = (mbd.getDependencyCheck() != 
            AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
    
    // 4. 过滤属性描述符
    PropertyDescriptor[] filteredPds = null;
    if (needsDepCheck) {
        if (filteredPds == null) {
            filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, 
                    mbd.allowCaching);
        }
    }
    
    // 5. 应用属性值
    if (pvs != null) {
        applyPropertyValues(beanName, mbd, bw, pvs);
    }
}

3.2 自动装配 ​

Spring支持以下几种自动装配模式:

  • byName:按名称自动装配
  • byType:按类型自动装配
  • constructor:构造器自动装配
  • no:不自动装配(默认)

🎯 四、初始化阶段 ​

4.1 初始化流程 ​

初始化阶段是Bean生命周期中最复杂的阶段,包含多个步骤。

initializeBean方法:

java
protected Object initializeBean(String beanName, Object bean,
        @Nullable RootBeanDefinition mbd) {
    // 1. 调用Aware接口方法
    if (System.getSecurityManager() != null) {
        AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
            invokeAwareMethods(beanName, bean);
            return null;
        }, getAccessControlContext());
    }
    else {
        invokeAwareMethods(beanName, bean);
    }
    
    Object wrappedBean = bean;
    if (mbd == null || !mbd.isSynthetic()) {
        // 2. BeanPostProcessor前置处理
        wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    }
    
    try {
        // 3. 调用初始化方法
        invokeInitMethods(beanName, wrappedBean, mbd);
    }
    catch (Throwable ex) {
        throw new BeanCreationException(...);
    }
    
    if (mbd == null || !mbd.isSynthetic()) {
        // 4. BeanPostProcessor后置处理
        wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }
    
    return wrappedBean;
}

4.2 Aware接口回调 ​

Spring提供了多个Aware接口,让Bean能够获取Spring容器的信息。

常见的Aware接口:

  • BeanNameAware:获取Bean名称
  • BeanFactoryAware:获取BeanFactory
  • ApplicationContextAware:获取ApplicationContext
  • ResourceLoaderAware:获取ResourceLoader
  • EnvironmentAware:获取Environment
  • MessageSourceAware:获取MessageSource

invokeAwareMethods方法:

java
private void invokeAwareMethods(String beanName, Object bean) {
    if (bean instanceof Aware) {
        if (bean instanceof BeanNameAware) {
            ((BeanNameAware) bean).setBeanName(beanName);
        }
        if (bean instanceof BeanClassLoaderAware) {
            ClassLoader bcl = getBeanClassLoader();
            if (bcl != null) {
                ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
            }
        }
        if (bean instanceof BeanFactoryAware) {
            ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
        }
    }
}

4.3 BeanPostProcessor处理 ​

前置处理:

java
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) 
        throws BeansException {
    return bean;
}

后置处理:

java
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) 
        throws BeansException {
    return bean;
}

4.4 初始化方法 ​

初始化方法按以下顺序执行:

  1. @PostConstruct注解的方法
  2. InitializingBean.afterPropertiesSet()方法
  3. init-method指定的方法

invokeInitMethods方法:

java
protected void invokeInitMethods(String beanName, Object bean,
        @Nullable RootBeanDefinition mbd) throws Throwable {
    boolean isInitializingBean = (bean instanceof InitializingBean);
    if (isInitializingBean && (mbd == null || 
            !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
        if (logger.isTraceEnabled()) {
            logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
        }
        if (System.getSecurityManager() != null) {
            try {
                AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
                    ((InitializingBean) bean).afterPropertiesSet();
                    return null;
                }, getAccessControlContext());
            }
            catch (PrivilegedActionException pae) {
                throw pae.getException();
            }
        }
        else {
            ((InitializingBean) bean).afterPropertiesSet();
        }
    }
    
    if (mbd != null && bean.getClass() != NullBean.class) {
        String initMethodName = mbd.getInitMethodName();
        if (StringUtils.hasLength(initMethodName) &&
                !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
                !mbd.isExternallyManagedInitMethod(initMethodName)) {
            invokeCustomInitMethod(beanName, bean, mbd);
        }
    }
}

@PostConstruct处理:

@PostConstruct注解的方法由CommonAnnotationBeanPostProcessor处理:

java
public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor
        implements InstantiationAwareBeanPostProcessor, BeanFactoryAware {
    
    public CommonAnnotationBeanPostProcessor() {
        setInitAnnotationType(PostConstruct.class);
        setDestroyAnnotationType(PreDestroy.class);
        setOrder(Ordered.LOWEST_PRECEDENCE - 3);
    }
}

🎯 五、销毁阶段 ​

5.1 销毁流程 ​

Bean的销毁在容器关闭时执行,销毁方法按以下顺序执行:

  1. @PreDestroy注解的方法
  2. DisposableBean.destroy()方法
  3. destroy-method指定的方法

destroy方法:

java
protected void destroyBean(String beanName, @Nullable DisposableBean bean) {
    if (bean != null) {
        try {
            bean.destroy();
        }
        catch (Throwable ex) {
            logger.error("Destroy method on bean with name '" + beanName + 
                    "' threw an exception", ex);
        }
    }
    
    // 调用自定义销毁方法
    if (bean != null) {
        RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
        String destroyMethodName = mbd.getDestroyMethodName();
        if (StringUtils.hasLength(destroyMethodName) &&
                !(bean instanceof DisposableBean && "destroy".equals(destroyMethodName)) &&
                !mbd.isExternallyManagedDestroyMethod(destroyMethodName)) {
            try {
                invokeCustomDestroyMethod(beanName, bean, mbd);
            }
            catch (Throwable ex) {
                logger.error("Custom destroy method '" + destroyMethodName + 
                        "' on bean with name '" + beanName + "' threw an exception", ex);
            }
        }
    }
}

5.2 DisposableBeanAdapter ​

DisposableBeanAdapter负责处理Bean的销毁逻辑:

java
public class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable {
    
    private final Object bean;
    private final String beanName;
    private final String destroyMethodName;
    
    @Override
    public void destroy() {
        // 处理@PreDestroy注解的方法
        if (this.bean instanceof DisposableBean) {
            ((DisposableBean) this.bean).destroy();
        }
        
        // 调用自定义销毁方法
        if (StringUtils.hasLength(this.destroyMethodName)) {
            invokeCustomDestroyMethod(this.destroyMethodName);
        }
    }
}

🎯 六、完整生命周期示例 ​

6.1 示例Bean ​

java
@Component
public class LifecycleBean implements BeanNameAware, BeanFactoryAware,
        ApplicationContextAware, InitializingBean, DisposableBean {
    
    private String beanName;
    
    public LifecycleBean() {
        System.out.println("1. 构造器调用");
    }
    
    @Autowired
    public void setDependency(SomeDependency dependency) {
        System.out.println("2. 属性注入:" + dependency);
    }
    
    @Override
    public void setBeanName(String name) {
        this.beanName = name;
        System.out.println("3. BeanNameAware.setBeanName: " + name);
    }
    
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("4. BeanFactoryAware.setBeanFactory");
    }
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) 
            throws BeansException {
        System.out.println("5. ApplicationContextAware.setApplicationContext");
    }
    
    @PostConstruct
    public void postConstruct() {
        System.out.println("6. @PostConstruct方法");
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("7. InitializingBean.afterPropertiesSet");
    }
    
    public void initMethod() {
        System.out.println("8. init-method方法");
    }
    
    @PreDestroy
    public void preDestroy() {
        System.out.println("9. @PreDestroy方法");
    }
    
    @Override
    public void destroy() throws Exception {
        System.out.println("10. DisposableBean.destroy");
    }
    
    public void destroyMethod() {
        System.out.println("11. destroy-method方法");
    }
}

执行顺序:

  1. 构造器调用
  2. 属性注入
  3. BeanNameAware.setBeanName
  4. BeanFactoryAware.setBeanFactory
  5. ApplicationContextAware.setApplicationContext
  6. BeanPostProcessor.postProcessBeforeInitialization
  7. @PostConstruct方法
  8. InitializingBean.afterPropertiesSet
  9. init-method方法
  10. BeanPostProcessor.postProcessAfterInitialization
  11. Bean使用阶段
  12. @PreDestroy方法
  13. DisposableBean.destroy
  14. destroy-method方法

📖 学习资源 ​

视频教程 ​

书籍推荐 ​

  • 《Spring源码深度解析》 - 郝佳
  • 《Spring技术内幕》 - 计文柯

网站资源 ​

✅ 学习检查清单 ​

  • [ ] 已理解Bean生命周期完整流程
  • [ ] 已理解实例化阶段
  • [ ] 已理解属性注入阶段
  • [ ] 已理解初始化阶段
  • [ ] 已理解Aware接口的作用
  • [ ] 已理解BeanPostProcessor的作用
  • [ ] 已理解初始化方法的执行顺序
  • [ ] 已理解销毁阶段
  • [ ] 已绘制Bean生命周期时序图
  • [ ] 已总结核心知识点

上一章节:AOP实现原理
下一章节:循环依赖处理
返回目录:Spring源码深度解析