转Spring中@PostConstruct、@PreDestroy、InitializingBean、DisposableBean、initMethod、de

这次的博客比较Spring中@PostConstruct、@PreDestroy、InitializingBean、DisposableBean、initMethod、destoryMethod的执行顺序,顺便会将construct以及与注入顺序一并比较

 

为了方便起见,这次不使用xml文件定义bean,完全采用注解配置,共3个类,都放在annotations包下

下面是定义的两个bean,Bean2直接加上@Conponent注解,加入到ioc容器

而Bean1,有1个注入属性、1个普通属性、1个构造器、3个初始化方法、3个销毁方法

Java代码   收藏代码
  1. public class Bean1 implements InitializingBean, DisposableBean{  
  2.       
  3.     @Autowired  
  4.     public Bean2 bean2;  
  5.       
  6.     public String state;  
  7.       
  8.     public Bean1 (){  
  9.         state = "construct!";  
  10.         System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);  
  11.     }  
  12.       
  13.     public void init_method (){  
  14.         state = "init-method!";  
  15.         System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);  
  16.     }  
  17.       
  18.     public void destory_method (){  
  19.         state = "destory-method!";  
  20.         System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);  
  21.     }  
  22.       
  23.     @PostConstruct   
  24.     public void postConstruct (){  
  25.         state = "postConstruct!";  
  26.         System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);  
  27.     }  
  28.       
  29.     @PreDestroy   
  30.     public void preDestory (){  
  31.         state = "preDestory!";  
  32.         System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);  
  33.     }  
  34.   
  35.     @Override  
  36.     public void destroy() throws Exception {  
  37.         state = "destory!";  
  38.         System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);  
  39.     }  
  40.   
  41.     @Override  
  42.     public void afterPropertiesSet() throws Exception {  
  43.         state = "afterPropertiesSet!";  
  44.         System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);  
  45.     }  
  46.   
  47. }  
  48.   
  49. @Component  
  50. public class Bean2 {  
  51.       
  52. }  

 

不要奇怪为什么Bean1没有加入到ioc容器,我们下面马上进行:

Java代码   收藏代码
  1. @Configuration  
  2. @org.springframework.context.annotation.ComponentScan(basePackages = "annotations")  
  3. public class ComponentScan {  
  4.       
  5.     @Bean(initMethod = "init_method", destroyMethod = "destory_method")  
  6.     public Bean1 bean1 (){  
  7.         return new Bean1();  
  8.     }  
  9.   
  10.     public static void main(String[] args) {  
  11.         AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();  
  12.         ctx.register(ComponentScan.class);  
  13.         ctx.refresh();  
  14.         ctx.registerShutdownHook();  
  15.     }  
  16.       
  17. }  

 可以通过@Configuration注册bean,和xml是一样的效果

 

打印结果为

Java代码   收藏代码
  1. bean1 -> construct!...bean2: null  
  2. bean1 -> postConstruct!...bean2: annotations.Bean2@35fc6dc4  
  3. bean1 -> afterPropertiesSet!...bean2: annotations.Bean2@35fc6dc4  
  4. bean1 -> init-method!...bean2: annotations.Bean2@35fc6dc4  
  5. bean1 -> preDestory!...bean2: annotations.Bean2@35fc6dc4  
  6. bean1 -> destory!...bean2: annotations.Bean2@35fc6dc4  
  7. bean1 -> destory-method!...bean2: annotations.Bean2@35fc6dc4  

 

所以执行顺序如下:

初始化时:构造器Construct  ->  属性注入  ->  @PostConstruct  ->  InitializingBean接口  ->  bean定义的initMethod 

销毁时:@PreDestroy  ->  DisposableBean接口 ->  bean定义的destoryMethod

 

When you work directly in Java, you can do anything you like with your objects and do not always need to rely on the container lifecycle!

猜你喜欢

转载自sunbin.iteye.com/blog/2285858
今日推荐