spring的@Bean的生命周期

本文详细探讨了Spring Bean的生命周期,从初始化到销毁的各个阶段。介绍了如何使用@Bean注解指定初始化和销毁方法,实现InitializingBean和DisposableBean接口,以及利用JSR250的注解@PostConstruct和@PreDestroy进行控制。此外,还讲解了BeanPostProcessor接口在bean初始化前后的作用。

bean的生命周期

1.什么是bean?

Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象。

Spring 容器会自动完成@bean对象的实例化。

创建应用对象之间的协作关系的行为称为:装配(wiring),这就是依赖注入的本质
bean的创建–初始化–销毁,默认都是容器自动完成,容器管理bean的生命周期
我们可以自定义初始化和销毁方法,当容器进行到bean的初始化和销毁时会默认执行我们自定义的方法

2.@Bean注解指定初始化和销毁方法

原来需要在xml的配置里面手动配置init-method和destory-method方法
自定的方法的要求需要没有参数可以抛出异常
在这里插入图片描述指定init-method和destory-method

public class Car {
    public Car(){
        System.out.println("car ...constructor");
    }

    public void init(){
        System.out.println("car ...init");
    }
    public void destroy(){
        System.out.println("car ...destroy");
    }
}
@Configuration
public class MyNewLifeCycle {

    @Bean
    public Car car(){
        return new Car();
    }
}
public class LifeCycle {
    @Test
    public void test01(){
        //第一步  创建ioc容器
        ApplicationContext context = new AnnotationConfigApplicationContext(MyNewLifeCycle.class);
        System.out.println("ioc容器创建完毕");
    }
}

在这里插入图片描述
可以看到当容器创建时容器中的bean也会被创建;
构造(对象创建):单实例:容器创建时创建对象
多实例:容器创建时不创建对象,当每次获取的时候才会创建对象
可以在bean注解上加上自定义的初始化和销毁方法

单例时:
在这里插入图片描述再次运行
在这里插入图片描述不难发现,组件会先创建然后初始化
在这里插入图片描述初始化:对象创建好,并赋值好时执行初始化方法,当容器关闭的时候bean组件将会被销毁。
多实例时:
组件的创建不会随容器的创建而创建,而是当请求获取的时候才会去创建实例对象
在这里插入图片描述多实例的bean的创建由容器管理,但是多实例的销毁不由容器销毁这个时候我们可以自己手动调用销毁方法。

构造(对象创建)
单实例:在容器启动的时候创建对象
多实例:在每次获取的时候创建对象

初始化:
对象创建完成,并赋值好,调用初始化方法。。。

销毁:
单实例:容器关闭的时候销毁
多实例:容器不会管理这个bean;容器不会调用销毁方法;

3. 实现初始化接口InitializingBean 和 销毁接口DisposableBean

通过让Bean实现InitializingBean(定义初始化逻辑); DisposableBean(定义销毁逻辑);

@Component//告诉spring这个组件,并将它放入到容器当中
public class Cat implements InitializingBean, DisposableBean {
    public Cat(){
        System.out.println("cat >>> constructor");
    }
        //在容器关闭之后会执行销毁方法
    public void destroy() throws Exception {
        System.out.println("cat >>> destroy");
    }
        //在属性设置完成之后,执行初始化操作
    public void afterPropertiesSet() throws Exception {
        System.out.println("cat >>> init");
    }
}

在这里插入图片描述

4. 使用JSR250 java中的注解

 @PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
  @PreDestroy:在容器销毁bean之前通知我们进行清理工作
@Component
public class Fish {
    public Fish(){
        System.out.println("fish >> constructor");
    }

    @PostConstruct//对象创建并赋值之后调用
    public void init(){
        System.out.println("Fish >> @PostConstruct");
    }

    @PreDestroy//容器移除对象之前
    public void destroy(){
        System.out.println("fish >> 销毁");
    }
}

在这里插入图片描述

5.使用接口 BeanPostProcessor :bean的后置处理器

接口BeanPostProcessor是 在bean初始化前后进行一些处理工作;

  • postProcessBeforeInitialization:在初始化之前工作
  • postProcessAfterInitialization:在初始化之后工作
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization"+bean+">>"+beanName);
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization"+bean+">>"+beanName);
        return bean;
    }
}

小结

1)、指定初始化和销毁方法;
通过@Bean指定init-method和destroy-method;

2)、通过让Bean实现InitializingBean(定义初始化逻辑),
DisposableBean(定义销毁逻辑);

3)、可以使用JSR250;
@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
@PreDestroy:在容器销毁bean之前通知我们进行清理工作

4)、BeanPostProcessor【interface】:bean的后置处理器;
在bean初始化前后进行一些处理工作;
postProcessBeforeInitialization:在初始化之前工作
postProcessAfterInitialization:在初始化之后工作

Spring 框架中,使用 `@Bean` 注解定义的 Bean生命周期Spring IoC 容器进行管理。其生命周期主要包含以下几个阶段: ### 1. Bean 的实例化 当容器启动时,Spring 会根据配置类中 `@Bean` 注解所标记的方法来创建 Bean 实例。这些方法通常返回一个对象,该对象将被注册为 Spring 容器中的一个 Bean [^1]。 ### 2. 属性填充(依赖注入) 创建 Bean 实例后,Spring 容器会自动将该 Bean 所需的依赖注入到其属性中。例如,如果某个 Bean 需要引用另一个 Bean,容器会自动完成这一过程 [^2]。 ### 3. 初始化阶段 Bean 的初始化可以通过以下几种方式定义: - 使用 `@PostConstruct` 注解标记的方法,该方法会在 Bean 的依赖注入完成后立即执行。 - 在 `@Bean` 注解中指定 `initMethod` 属性,指向一个自定义的初始化方法。 - 实现 `InitializingBean` 接口,并在 `afterPropertiesSet()` 方法中定义初始化逻辑。 这些初始化方法通常用于执行一些在 Bean 使用前必须完成的操作,例如加载配置、连接数据库等 [^2]。 ### 4. 使用阶段 初始化完成后,Bean 进入使用阶段。此时,Bean 已经准备好,可以被应用程序使用。Spring 容器会负责管理 Bean 的作用域,例如单例(Singleton)、原型(Prototype)等 。 ### 5. 销毁阶段 当容器关闭时,Spring 会执行 Bean 的销毁逻辑。销毁阶段可以通过以下方式定义: - 使用 `@PreDestroy` 注解标记的方法,该方法会在容器关闭前执行。 - 在 `@Bean` 注解中指定 `destroyMethod` 属性,指向一个自定义的销毁方法。 - 实现 `DisposableBean` 接口,并在 `destroy()` 方法中定义销毁逻辑。 销毁方法通常用于释放资源,例如关闭数据库连接、释放内存等 [^2]。 ### 示例代码 以下是一个展示 `@Bean` 注解生命周期管理的示例代码: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; @Configuration public class AppConfig { @Bean(initMethod = "customInit", destroyMethod = "customDestroy") public MyBean myBean() { return new MyBean(); } public static class MyBean { public void customInit() { System.out.println("Custom initialization logic"); } public void customDestroy() { System.out.println("Custom destruction logic"); } @PostConstruct public void postConstruct() { System.out.println("PostConstruct method executed"); } @PreDestroy public void preDestroy() { System.out.println("PreDestroy method executed"); } public void doSomething() { System.out.println("Doing something..."); } } } ``` ### 6. 生命周期顺序总结 Spring 容器对 Bean 生命周期的管理遵循以下顺序: 1. **实例化**:调用 `@Bean` 方法创建 Bean 实例。 2. **属性注入**:注入依赖项。 3. **`@PostConstruct` 方法**:执行注解标记的初始化方法。 4. **`initMethod` 或 `afterPropertiesSet()` 方法**:执行自定义初始化逻辑。 5. **使用阶段**:Bean 被应用程序使用。 6. **`@PreDestroy` 方法**:在容器关闭前执行注解标记的销毁方法。 7. **`destroyMethod` 或 `destroy()` 方法**:执行自定义销毁逻辑 。 通过上述机制,Spring 提供了对 `@Bean` 注解定义的 Bean 生命周期的全面管理,确保 Bean 在整个应用程序运行期间能够正确地初始化和销毁。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值