spring的@Bean的生命周期

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:在初始化之后工作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值