Spring Bean的生命周期

一、Spring Bean的生命周期

        在Spring框架中,Bean的生命周期是指从创建到销毁的过程。以下是Spring Bean生命周期的主要步骤:

1. 实例化 (Instantiation):
        Spring容器根据配置元数据(如XML或注解)调用无参构造函数或静态工厂方法来创建Bean实例。
2. 属性赋值 (Populate Properties):
        实例化后,Spring容器使用依赖注入(DI)将属性值和依赖对象注入到Bean实例中。
3. 设置Bean名称 (Setting Bean Name):
        如果Bean实现了BeanNameAware接口,Spring会调用setBeanName(String name)方法,传递Bean的名称。
4. 设置Bean工厂 (Setting Bean Factory):
        如果Bean实现了BeanFactoryAware接口,Spring会调用setBeanFactory(BeanFactory beanFactory)方法,传递当前的Bean工厂。
5. 前置处理 (Pre-Initialization):
        如果有BeanPostProcessor接口的实现类,Spring会调用postProcessBeforeInitialization(Object bean, String beanName)方法。
6. 初始化 (Initialization):
        如果Bean实现了InitializingBean接口,Spring会调用afterPropertiesSet()方法。
        如果配置文件中有init-method属性,Spring会调用指定的方法。
7. 后置处理 (Post-Initialization):
        如果有BeanPostProcessor接口的实现类,Spring会调用postProcessAfterInitialization(Object bean, String beanName)方法。
8. 使用阶段 (Ready for Use):
        Bean已经完全初始化,可以被应用程序使用了。
9. 销毁 (Destruction):
        当容器关闭时,如果Bean实现了DisposableBean接口,Spring会调用destroy()方法。
        如果配置文件中有destroy-method属性,Spring会调用指定的方法。
通过这些步骤,Spring确保每个Bean在使用之前都处于正确且可预测的状态,并在不再需要时能够正确地清理资源。

二、生命周期的示例代码

1、LifecycleDemoBean.java


import org.springframework.beans.factory.*;
import javax.annotation.*;

public class LifecycleDemoBean implements BeanNameAware, BeanFactoryAware, 
        ApplicationContextAware, InitializingBean, DisposableBean {
    
    private String name;

    // 1. 构造方法
    public LifecycleDemoBean() {
        System.out.println("1. 构造方法执行");
    }

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

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

    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        System.out.println("3. BeanFactoryAware回调");
    }

    @Override
    public void setApplicationContext(ApplicationContext ctx) {
        System.out.println("3. ApplicationContextAware回调");
    }

    // 4. @PostConstruct
    @PostConstruct
    public void postConstruct() {
        System.out.println("4. @PostConstruct方法执行");
    }

    // 5. InitializingBean
    @Override
    public void afterPropertiesSet() {
        System.out.println("5. InitializingBean.afterPropertiesSet()");
    }

    // 6. init-method
    public void customInit() {
        System.out.println("6. 自定义init-method执行");
    }

    // 7. @PreDestroy
    @PreDestroy
    public void preDestroy() {
        System.out.println("7. @PreDestroy方法执行");
    }

    // 8. DisposableBean
    @Override
    public void destroy() {
        System.out.println("8. DisposableBean.destroy()");
    }

    // 9. destroy-method
    public void customDestroy() {
        System.out.println("9. 自定义destroy-method执行");
    }
}

2、AppConfig.java

import org.springframework.context.annotation.*;

@Configuration
public class AppConfig {
    @Bean(initMethod = "customInit", destroyMethod = "customDestroy")
    public LifecycleDemoBean demoBean() {
        LifecycleDemoBean bean = new LifecycleDemoBean();
        bean.setName("测试Bean");
        return bean;
    }
}

3、MainApp.java

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = 
            new AnnotationConfigApplicationContext(AppConfig.class);
        ctx.getBean(LifecycleDemoBean.class);
        ctx.close(); // 触发销毁
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码的余温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值