Spring bean 的初始化和销毁的三种方式和执行顺序

    xiaoxiao2021-03-25  95

    Spring 容器中的 Bean 是有生命周期的,spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。 下面是常用的三种指定特定操作的方法:

    通过实现InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法; 通过<bean> 元素的init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;在指定方法上加上@PostConstruct或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。

    这几种配置方式,执行顺序是怎样的呢?我们通过例子来研究下:

    Bean的列子类:InitBeanAndDestroyBean.java

    package com.chenfeng.xiaolyuh.entity; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; public class InitBeanAndDestroyBean implements InitializingBean, DisposableBean { public String say() { return "Hello!" + this.getClass().getName(); } public InitBeanAndDestroyBean() { System.out.println("执行InitBeanAndDestroyBean构造方法"); } @Override public void destroy() throws Exception { System.out.println("接口-执行InitBeanAndDestroyBeanTest:destroy方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("接口-执行InitBeanAndDestroyBeanTest:afterPropertiesSet方法"); } @PostConstruct public void postConstructstroy() { System.out.println("注解-执行InitBeanAndDestroyBeanTest:preDestroy方法"); } @PreDestroy public void preDestroy() { System.out.println("注解--执行InitBeanAndDestroyBeanTest:preDestroy方法"); } public void initMethod() { System.out.println("XML配置-执行InitBeanAndDestroyBeanTest:init-method方法"); } public void destroyMethod() { System.out.println("XML配置-执行InitBeanAndDestroyBeanTest:destroy-method方法"); } }

    Spring配置类MyConfig.java

    @Configuration // 声明成配置文件 @ComponentScan("com.chenfeng.xiaolyuh") // 扫描包 public class MyConfig { // 测试Bean的几种初始化和销毁方式,和执行顺序 @Bean(initMethod="initMethod", destroyMethod="destroyMethod") public InitBeanAndDestroyBean initBeanAndDestroyBean() { return new InitBeanAndDestroyBean(); } }

    测试类SpringIocTest.java

    public class SpringIocTest { // 使用容器 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class, CatEntity.class); @Test public void contextTest() { // 测试Bean的三种初始化、销毁方式和执行顺序 System.out.println(context.getBean(InitBeanAndDestroyBean.class)); } @After public void closeContext() { context.close(); } } 打印结果:

    三月 10, 2017 1:47:02 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@3b22cdd0: startup date [Fri Mar 10 13:47:02 CST 2017]; root of context hierarchy 执行InitBeanAndDestroyBean构造方法 注解-执行InitBeanAndDestroyBeanTest:preDestroy方法 接口-执行InitBeanAndDestroyBeanTest:afterPropertiesSet方法 XML配置-执行InitBeanAndDestroyBeanTest:init-method方法 三月 10, 2017 1:47:02 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose 信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@3b22cdd0: startup date [Fri Mar 10 13:47:02 CST 2017]; root of context hierarchy 注解--执行InitBeanAndDestroyBeanTest:preDestroy方法 接口-执行InitBeanAndDestroyBeanTest:destroy方法 XML配置-执行InitBeanAndDestroyBeanTest:destroy-method方法

    从执行结果可以看出: 

    Bean在实例化的过程中:Constructor > @PostConstruct >InitializingBean > init-methodBean在销毁的过程中:@PreDestroy > DisposableBean > destroy-method github地址

    转载请注明原文地址: https://ju.6miu.com/read-20189.html

    最新回复(0)