Bean生命周期

Bean生命周期

Bean生命周期(基于 AbstractAutowireCapableBeanFactory)

本文根据deepseek回复整合。仅用来协助理解spring流程。
代码基于 spring-beans:6.2.8,为了便于理解做了代码修改

一、生命周期(略)

二、代码解析

入口方法:doCreateBean

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
        throws BeanCreationException {
        
    // 1. 实例化 Bean(创建对象实例)
    BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);
    Object bean = instanceWrapper.getWrappedInstance();
    
    // 2. 处理循环依赖:提前暴露 ObjectFactory
    if (mbd.isSingleton()) {
        addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
    }

    // 3. 属性填充(依赖注入)
    populateBean(beanName, mbd, instanceWrapper);
    
    // 4. 初始化 Bean(包含后置处理器的前置/后置处理)
    exposedObject = initializeBean(beanName, exposedObject, mbd);
    
    // 5. 注册销毁回调
    registerDisposableBeanIfNecessary(beanName, bean, mbd);
    
    return exposedObject;

三、详细步骤

步骤 1:实例化 Bean - createBeanInstance

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
    // 1.1 使用 Supplier 方式创建(@Bean 的 supplier 属性)
    Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
    if (instanceSupplier != null) {
        return obtainFromSupplier(instanceSupplier, beanName, mbd);
    }
    
    // 1.2 使用工厂方法创建(@Bean 的 factory-method 或 FactoryBean)
    if (mbd.getFactoryMethodName() != null) {
        return instantiateUsingFactoryMethod(beanName, mbd, args);
    }
    
    // 1.3 推断构造函数:@Autowired(required=true) 或参数最多的构造函数
    Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
    if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
            mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
        return autowireConstructor(beanName, mbd, ctors, args);
    }
    
    // 1.4 默认无参构造器实例化
    return instantiateBean(beanName, mbd);
}

步骤 2:处理循环依赖 - 三级缓存

AbstractAutowireCapableBeanFactory.doCreateBean() 方法

// 实例化完成后立即暴露 ObjectFactory
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
        isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
    // 将 ObjectFactory 放入三级缓存
    addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}


// getEarlyBeanReference 会调用 SmartInstantiationAwareBeanPostProcessor
// 这里就是 AOP 代理创建的关键点
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
    Object exposedObject = bean;
    for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
        exposedObject = bp.getEarlyBeanReference(exposedObject, beanName);
    }
    return exposedObject;
}

步骤 3:属性填充 - populateBean

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
    
    // 3.1 调用 InstantiationAwareBeanPostProcessor 的 postProcessAfterInstantiation
    //     返回 false 可跳过属性填充(常用于创建不需要注入的代理对象)
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
        for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
            if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                return; // 跳过后续属性填充
            }
        }
    }
    
    // 3.2 根据 autowire 模式(byName/byType)进行自动注入
    int resolvedAutowireMode = mbd.getResolvedAutowireMode();
    if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
        MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
        if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
            autowireByName(beanName, mbd, bw, newPvs);  // 按名称匹配
        }
        if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
            autowireByType(beanName, mbd, bw, newPvs);  // 按类型匹配
        }
        pvs = newPvs;
    }
    
    // 3.3 调用 BeanPostProcessor 处理 @Autowired 等注解注入
    //     注意:AutowiredAnnotationBeanPostProcessor 在这里工作
    if (hasInstantiationAwareBeanPostProcessors()) {
        for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
            PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
            // 注入 @Value、@Autowired 等
        }
    }
}

步骤 4:初始化 Bean - initializeBean

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
    
    // 4.1 执行 Aware 方法注入
    invokeAwareMethods(beanName, bean);
    
    // 4.2 初始化前置处理(BeanPostProcessor.before)
    Object wrappedBean = bean;
    if (mbd == null || !mbd.isSynthetic()) {
        wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    }
    
    // 4.3 执行初始化方法
    try {
        invokeInitMethods(beanName, wrappedBean, mbd);
    } 
    catch (Throwable ex) {
        throw new BeanCreationException(mbd.getResourceDescription(), beanName, ex);
    }
    
    // 4.4 初始化后置处理(BeanPostProcessor.after)- AOP 代理创建处
    if (mbd == null || !mbd.isSynthetic()) {
        wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }
    
    return wrappedBean;
}

4.1 Aware 方法注入

(这段代码方便理解, 不粘贴源代码了)

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

4.2 初始化前置处理

public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) {
    Object result = existingBean;
    for (BeanPostProcessor processor : getBeanPostProcessors()) {
        Object current = processor.postProcessBeforeInitialization(result, beanName);
        if (current == null) {
            return result;
        }
        result = current;
    }
    return result;
}

4.3 执行初始化方法

protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd)
        throws Throwable {
    
    // 4.3.1 执行 InitializingBean 接口方法
    boolean isInitializingBean = (bean instanceof InitializingBean);
    if (isInitializingBean && (mbd == null || !mbd.hasAnyExternallyManagedInitMethod("afterPropertiesSet"))) {
        ((InitializingBean) bean).afterPropertiesSet();
    }

    // 4.3.2 执行自定义 init-method(@Bean(initMethod="xxx") 或 XML 配置)
    if (mbd != null && bean.getClass() != NullBean.class) {
        String[] initMethodNames = mbd.getInitMethodNames();
        if (initMethodNames != null) {
            for (String initMethodName : initMethodNames) {
                if (StringUtils.hasLength(initMethodName) &&
                        !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
                        !mbd.hasAnyExternallyManagedInitMethod(initMethodName)) {
                    invokeCustomInitMethod(beanName, bean, mbd, initMethodName);
                }
            }
        }
    }

4.4 初始化后置处理(AOP 代理创建)

public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) {
    Object result = existingBean;
    for (BeanPostProcessor processor : getBeanPostProcessors()) {
        Object current = processor.postProcessAfterInitialization(result, beanName);
        if (current == null) {
            return result;
        }
        result = current;
    }
    return result;
}

步骤 5:注册销毁回调

protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) {
    if (!mbd.isPrototype() && requiresDestruction(bean, mbd)) {
        if (mbd.isSingleton()) {
            // 注册到 disposableBeans Map 中
            registerDisposableBean(beanName, new DisposableBeanAdapter(
                    bean, beanName, mbd, getBeanPostProcessorCache().destructionAware));
        }
    }
}

// DisposableBeanAdapter 会在容器关闭时调用
public void destroy() {
    // 调用 @PreDestroy 方法(这个在哪,没注意到)
    // 调用 DisposableBean.destroy() 方法  
    // 调用自定义 destroy-method
}

四、完整生命周期代码示例

@Component
public class LifecycleDemoBean implements BeanNameAware, BeanFactoryAware, 
                                          InitializingBean, DisposableBean {
    
    private String name;
    
    public LifecycleDemoBean() {
        System.out.println("1. 实例化:构造器调用");
    }
    
    @Autowired
    public void setName(String name) {
        System.out.println("2. 属性填充:@Autowired 注入");
        this.name = name;
    }
    
    @PostConstruct
    public void postConstruct() {
        System.out.println("3. 初始化前:@PostConstruct 调用");
    }
    
    @Override
    public void setBeanName(String name) {
        System.out.println("4. Aware 注入:BeanNameAware.setBeanName - " + name);
    }
    
    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        System.out.println("5. Aware 注入:BeanFactoryAware.setBeanFactory");
    }
    
    @Override
    public void afterPropertiesSet() {
        System.out.println("6. 初始化:InitializingBean.afterPropertiesSet");
    }
    
    @Bean(initMethod = "customInitMethod")
    public void customInitMethod() {
        System.out.println("7. 初始化:自定义 init-method 调用");
    }
    
    @PreDestroy
    public void preDestroy() {
        System.out.println("8. 销毁前:@PreDestroy 调用");
    }
    
    @Override
    public void destroy() {
        System.out.println("9. 销毁:DisposableBean.destroy");
    }
    
    // 假设有 AOP 切面
    public void businessMethod() {
        System.out.println("执行业务方法");
    }
}

// 输出顺序:
// 1. 实例化:构造器调用
// 2. 属性填充:@Autowired 注入
// 3. 初始化前:@PostConstruct 调用
// 4. Aware 注入:BeanNameAware.setBeanName
// 5. Aware 注入:BeanFactoryAware.setBeanFactory
// 6. 初始化:InitializingBean.afterPropertiesSet
// 7. 初始化:自定义 init-method 调用
// (这里会创建 AOP 代理,如果适用)
// --- 容器关闭时 ---
// 8. 销毁前:@PreDestroy 调用
// 9. 销毁:DisposableBean.destroy

五、所有 BeanPostProcessor 的执行时机

处理器类型 方法 调用时机
InstantiationAwareBeanPostProcessor postProcessBeforeInstantiation 实例化前
SmartInstantiationAwareBeanPostProcessor determineCandidateConstructors 选择构造器时
InstantiationAwareBeanPostProcessor postProcessAfterInstantiation 实例化后、填充前
InstantiationAwareBeanPostProcessor postProcessProperties 属性填充时
BeanPostProcessor postProcessBeforeInitialization 初始化前(Aware之后)
BeanPostProcessor postProcessAfterInitialization 初始化后(AOP代理)
DestructionAwareBeanPostProcessor postProcessBeforeDestruction 销毁前

六、调试技巧

// 1. 在 AbstractAutowireCapableBeanFactory 的 doCreateBean 方法打条件断点
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
    // 条件:beanName.equals("yourBeanName")
}

// 2. 启用调试日志
logging.level.org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory=DEBUG

// 3. 实现 BeanPostProcessor 并打印日志
@Component
public class LifecycleLogger implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        System.out.println("Before init: " + beanName + " - " + bean.getClass());
        return bean;
    }
    
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        System.out.println("After init: " + beanName + " - " + bean.getClass());
        return bean;
    }
}

核心理解:整个生命周期中,最重要的扩展点是各种 BeanPostProcessor,它们实现了 Spring 几乎所有的注解支持和 AOP 功能。

tag

  • spring
  • 生命周期
posted @ 2026-05-24 22:52  微明Studio  阅读(9)  评论(0)    收藏  举报