Spring bean 的初始化和销毁的三种方式和执行顺序
2017-03-10 13:50
525 查看
Spring 容器中的 Bean 是有生命周期的,spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。 下面是常用的三种指定特定操作的方法:
通过实现InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
通过<bean> 元素的init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;
在指定方法上加上@PostConstruct或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。
这几种配置方式,执行顺序是怎样的呢?我们通过例子来研究下:
Bean的列子类:InitBeanAndDestroyBean.java
Spring配置类MyConfig.java
测试类SpringIocTest.java
打印结果:
三月 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-method
Bean在销毁的过程中:@PreDestroy > DisposableBean > destroy-method
github地址
通过实现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-method
Bean在销毁的过程中:@PreDestroy > DisposableBean > destroy-method
github地址
相关文章推荐
- Spring bean 实现初始化、销毁方法的方式及顺序
- Spring初始化Bean或销毁Bean前执行操作的方式
- 关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种
- 关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种
- spring bean的几种初始化方法和销毁方法的先后顺序
- Spring bean的初始化和销毁三种方式及优先级
- Cocos2d-x初始化对象和销毁对象函数执行顺序
- Java 指定线程执行顺序(三种方式)
- Java 指定线程执行顺序(三种方式)
- C#创建对象时各种初始化属性、字段的方式的执行顺序
- 在spring容器中定义初始化和销毁bean前所做的操作,有三种方式
- C++ 三种继承方式和构造函数执行的顺序
- Java 指定线程执行顺序(三种方式)
- 拨云见日---浅谈静态字段与静态构造函数之间的初始化关系以及执行顺序(下)
- 执行shell脚本的三种方式
- 关于类继承/初始化成员变量/构造函数/析构函数 执行顺序
- Java类中构造方法的执行顺序和变量初始化
- Java静态变量初始化及构造函数的执行顺序与执行时机分析
- 浅谈静态字段与静态构造函数之间的初始化关系以及执行顺序
- C#初始化数组的三种方式(转)