好玩Spring之InitializingBean/DisposableBean与@PostConstruct/@PreDestroy

官方推荐

在这里插入图片描述
从以上官方文档看,不管是初始化还是销毁,更推荐使用@PostConstruct /@PreDestroy 和 init-method / destroy-method 方式,不推荐使用实现InitializingBean / DisposableBean 接口方式,因为这种方式与Spring耦合性更强。

下面我们就来看看每种方式,如何实现。

初始化

我们在对bean进行一些自定义初始化时,可以使用

  • @PostConstruct
  • 实现InitializingBean接口的afterPropertiesSet()方法
  • @Bean(initMethod = “initMethod”)
  • 在xml文件中,设置全局default-init-method=“init”
public class TestInit implements InitializingBean {

    private String name;

    public TestInit() {
        System.out.println("construct");
        if(name != null) {
            System.out.println("Get name: "+name);
        }
    }

    @PostConstruct // 方式一
    public void postConstruct() {
        System.out.println("postConstruct");
        if(name != null) {
            System.out.println("Get name: "+name);
        }
    }

    @Override // 方式二
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet");
        if(name != null) {
            System.out.println("Get name: "+name);
        }
    }

    public void initMethod() {
        System.out.println("initMethod");
        if(name != null) {
            System.out.println("Get name: "+name);
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
@Component
public class InitDemo {
    @Bean(initMethod = "initMethod") // 方式三
    public TestInit initTest() {
        TestInit test = new TestInit();
        test.setName("name11");
        return test;
    }
}
public class MainTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(InitDemo.class);
    }
}

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context.xsd"
   default-init-method="init" default-destroy-method="destroy">
   
 <!-- 方式四 -->
 <context:component-scan base-package="bean.dfault.callbacLks"/>
 
</beans>

方式四,没有试验,请各位验证。

输出结果

construct
postConstruct
Get name: name11
afterPropertiesSet
Get name: name11
initMethod
Get name: name11

结果说明,程序执行顺序为:
construct > 属性设置 > @PostConstruct > InitializingBean.afterPropertiesSet() > initMethod
图片来源于网络
[图片来源于网络]

销毁

跟初始化同样,我们在销毁前也可以进行一些自定义操作,

  • @PreDestroy注解
  • 实现DisposableBean接口的destroy()方法
  • @Bean(destroyMethod = “destroyMethod”)
  • default-destroy-method="destroy"方法,同初始化的xml设置
public class TestDestroy implements DisposableBean {

    @PreDestroy // 方式一
    public void preDestroy() {
        System.out.println("preDestroy");
    }

    @Override // 方式二
    public void destroy() throws Exception {
        System.out.println("destroy");
    }

    public void destroyMethod() {
        System.out.println("destroyMethod");
    }
}
@Component
public class DestroyDemo {

    @Bean(destroyMethod = "destroyMethod") // 方式三
    public TestDestroy testDestroy() {
        return new TestDestroy();
    }
}
public class MainTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(DestroyDemo.class);

        //This is important
        context.registerShutdownHook();
    }
}

输出结果

preDestroy
destroy
destroyMethod

说明执行的顺序为:
@PreDestroy > DisposableBean.destroy() > destroyMethod
在这里插入图片描述
[图片来源于网络]

参考:
Official Spring Doc
Spring bean Lifecycle Callbacks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值