这几种配置方式,执行顺序是怎样的呢?我们通过例子来研究下:
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地址