Spring Bean的中自定义初始化和销毁方法

文章详细介绍了在Spring框架中,如何通过实现InitializingBean/DisposableBean接口、使用@Bean的initMethod/destroyMethod属性以及添加@PostConstruct/@PreDestroy注解来控制Bean的初始化和销毁过程。并通过一个示例展示了这些方式的执行顺序,显示了@PostConstruct/@PreDestroy注解具有最高优先级,实现接口次之,@Bean属性指定的初始化方法优先级最低。

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

有三种方式

  • 通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
  • 通过 @Bean的 initMethod/destroyMethod 属性指定初始化之后 /销毁之前调用的操作方法;
  • 在指定方法上加上@PostConstruct 或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。

具体代码

@Configuration
@ComponentScan("com.example.config")
public class AppConfig {

   @Bean(initMethod = "pigInitMethod",destroyMethod = "pigDestroyMethod")
   public Pig Pig(){
      return new Pig();
   }
}
public class Pig implements InitializingBean, DisposableBean {
   private String name;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   @PostConstruct
   public void postConstruct(){
      System.out.println("这是@PostConstruct注解标注得方法");
   }

   //对象被从ioc容器中移除之前调用
   @PreDestroy
   public void preDestroy() {
      System.out.println("@PreDestroy(销毁逻辑)注解");
   }


   private void pigInitMethod() {
      System.out.println("使用@Bean注解指定初始化执行");
   }

   private void pigDestroyMethod() {
      System.out.println("使用@Bean注解指定初始化和销毁方法执行");
   }

   @Override
   public void afterPropertiesSet() throws Exception {
      System.out.println("实现InitializingBean的afterPropertiesSet()初始方法");
   }

   @Override
   public void destroy() throws Exception {
      System.out.println("实现DisposableBean接口自定义销毁方法");
   }
}

可以再添加一个自定义的 BeanPostProcessor

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
   @Override
   public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
      System.out.println(bean.getClass().getName()+"Bean 初始化之前");
      return bean;
   }

   @Override
   public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
      System.out.println(bean.getClass().getName()+"Bean 初始化之前后");
      return bean;
   }
}

测试代码

@Test
public void testInitMethod(){
   AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( AppConfig.class );
   System.out.println("打印输出Pig对象"+ context.getBean( Pig.class ));
   context.close();

}

输出结果

com.example.po.PigBean 初始化之前      
这是@PostConstruct注解标注得方法
实现InitializingBean的afterPropertiesSet()初始方法
使用@Bean注解指定初始化执行
com.example.po.PigBean 初始化之前后
打印输出Pig对象com.example.po.Pig@52045dbe
@PreDestroy(销毁逻辑)注解
实现DisposableBean接口自定义销毁方法
使用@Bean注解指定初始化和销毁方法执行

由输出结果可以看出

@PostConstruct 或@PreDestroy注解 优先级最高

实现 InitializingBean/DisposableBean接口 优先级次之

@Bean的 initMethod/destroyMethod属性指定初始化 优先级最低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值