当前位置: 首页 > news >正文

Spring Bean 生命周期简单代码说明

1. Bean 生命周期流程图
容器启动
  │
  ├─1. Bean 实例化(调用构造函数)
  │
  ├─2. 属性注入(依赖注入)
  │
  ├─3. Aware 接口回调(BeanNameAware、BeanFactoryAware 等)
  │
  ├─4. BeanPostProcessor.postProcessBeforeInitialization()
  │
  ├─5. 初始化方法(@PostConstruct、InitializingBean.afterPropertiesSet()、init-method)
  │
  ├─6. BeanPostProcessor.postProcessAfterInitialization()
  │
  ├─7. Bean 就绪(进入可用状态)
  │
  └─容器关闭
       │
       ├─8. 销毁方法(@PreDestroy、DisposableBean.destroy()、destroy-method)
       │
       └─资源释放

2. 核心阶段代码实现
示例 Bean 类
public class DemoBean implements BeanNameAware, BeanFactoryAware,
                               InitializingBean, DisposableBean {

    private String name;

    // 1. 实例化(构造函数)
    public DemoBean() {
        System.out.println("1. 构造函数调用");
    }

    // 2. 属性注入
    public void setName(String name) {
        this.name = name;
        System.out.println("2. 属性注入: name = " + name);
    }

    // 3.1 BeanNameAware 接口回调
    @Override
    public void setBeanName(String beanName) {
        System.out.println("3.1 BeanNameAware: beanName = " + beanName);
    }

    // 3.2 BeanFactoryAware 接口回调
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("3.2 BeanFactoryAware: beanFactory = " + beanFactory);
    }

    // 5.1 @PostConstruct 注解(需启用注解驱动)
    @PostConstruct
    public void postConstruct() {
        System.out.println("5.1 @PostConstruct 方法调用");
    }

    // 5.2 InitializingBean 接口方法
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("5.2 InitializingBean.afterPropertiesSet()");
    }

    // 5.3 自定义初始化方法(XML/JavaConfig 配置)
    public void customInit() {
        System.out.println("5.3 自定义 init-method");
    }

    // 8.1 @PreDestroy 注解(需启用注解驱动)
    @PreDestroy
    public void preDestroy() {
        System.out.println("8.1 @PreDestroy 方法调用");
    }

    // 8.2 DisposableBean 接口方法
    @Override
    public void destroy() throws Exception {
        System.out.println("8.2 DisposableBean.destroy()");
    }

    // 8.3 自定义销毁方法(XML/JavaConfig 配置)
    public void customDestroy() {
        System.out.println("8.3 自定义 destroy-method");
    }
}
BeanPostProcessor 实现
public class DemoBeanPostProcessor implements BeanPostProcessor {

    // 4. 初始化前处理
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        if (bean instanceof DemoBean) {
            System.out.println("4. BeanPostProcessor.postProcessBeforeInitialization()");
        }
        return bean;
    }

    // 6. 初始化后处理
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        if (bean instanceof DemoBean) {
            System.out.println("6. BeanPostProcessor.postProcessAfterInitialization()");
        }
        return bean;
    }
}

3. 配置方式
XML 配置
<bean id="demoBean" class="com.example.DemoBean"
      init-method="customInit"
      destroy-method="customDestroy">
    <property name="name" value="test-bean"/>
</bean>

<bean class="com.example.DemoBeanPostProcessor"/>
Java 配置
@Configuration
public class AppConfig {

    @Bean(initMethod = "customInit", destroyMethod = "customDestroy")
    public DemoBean demoBean() {
        DemoBean bean = new DemoBean();
        bean.setName("test-bean");
        return bean;
    }

    @Bean
    public DemoBeanPostProcessor demoBeanPostProcessor() {
        return new DemoBeanPostProcessor();
    }
}
注解驱动支持
@Configuration
@ComponentScan(basePackages = "com.example")
@EnableAspectJAutoProxy // 启用注解驱动(如 @PostConstruct)
public class AppConfig {}

4. 测试代码
public class LifecycleTest {

    public static void main(String[] args) {
        // 创建容器
        AnnotationConfigApplicationContext context = 
            new AnnotationConfigApplicationContext(AppConfig.class);

        DemoBean bean = context.getBean(DemoBean.class);
        System.out.println("7. Bean 已就绪: " + bean);

        // 关闭容器(触发销毁方法)
        context.close();
    }
}

5. 输出结果
1. 构造函数调用
2. 属性注入: name = test-bean
3.1 BeanNameAware: beanName = demoBean
3.2 BeanFactoryAware: beanFactory = ...(容器对象)
4. BeanPostProcessor.postProcessBeforeInitialization()
5.1 @PostConstruct 方法调用
5.2 InitializingBean.afterPropertiesSet()
5.3 自定义 init-method
6. BeanPostProcessor.postProcessAfterInitialization()
7. Bean 已就绪: com.example.DemoBean@123456
8.1 @PreDestroy 方法调用
8.2 DisposableBean.destroy()
8.3 自定义 destroy-method

6. 关键扩展点总结
扩展方式适用场景优先级顺序
@PostConstruct推荐使用,代码简洁最先执行
InitializingBean框架接口,侵入性强次之
init-methodXML/Java 配置,无侵入最后执行
BeanPostProcessor全局拦截所有 Bean 的初始化过程在初始化前后插入逻辑

7. 注意事项
  1. 作用域影响‌:
    • prototype 作用域的 Bean 不会触发销毁方法(需手动管理资源)。
  2. 执行顺序‌:
    • Aware 接口回调在属性注入之后、初始化方法之前执行。
  3. 配置冲突‌:
    • 若同时使用 @PostConstructInitializingBean 和 init-method,执行顺序如上所示。
  4. 容器关闭‌:
    • 需调用 context.close()(或 context.registerShutdownHook())触发销毁方法。

相关文章:

  • 实现腾讯云COS图片上传并确保可预览
  • haackmyvm-qweasd
  • 金融大模型
  • 射频前端从器件到模块简略
  • 【回眸】Linux 内核 (十三)进程间通讯 之 共享内存
  • QML Loader:加载组件与状态监控
  • ragflow开启https访问:ssl证书为pem文件,window如何添加证书
  • 电脑屏保壁纸怎么设置 桌面壁纸设置方法详解
  • PyTorch多GPU训练实战:从零实现到ResNet-18模型
  • ngx_cycle_modules
  • this指针 和 类的继承
  • Django异步执行任务django-background-tasks
  • 下一代智能爬虫框架:ScrapeGraphAI 详解
  • 第一章 react redux的学习,单个reducer
  • macOS Chrome - 打开开发者工具,设置 Local storage
  • nginx 代理 https 接口
  • Ubuntu虚拟机编译安装部分OpenCV模块方法实现——保姆级教程
  • Corrective Retrieval Augmented Generation
  • GitHub 趋势日报 (2025年04月04日)
  • 【区块链安全 | 第二十九篇】合约(三)
  • 怎么在百度做公司网站/百度免费咨询
  • 做二手电脑的网站/网站应该如何推广
  • 做网站的算什么行业/网站建设图片
  • 网站建设服务器一般多少钱/百度热搜榜在哪里看
  • 电子元器件商城/网站seo在线诊断分析
  • 企业网站建设感想/哪些行业适合做网络推广