zoukankan      html  css  js  c++  java
  • spring实现listener(转)

    博主说未经同意,不能转载,我这种小码农,他应该不会在乎

    原创地址:http://blog.csdn.net/caihaijiang/article/details/8629725

    spring 允许 Bean 在初

    始化完成后以及销毁前执行特定的操作。下面是常用的三种指定特定操作的方法:

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

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

    Java类:

    1. import javax.annotation.PostConstruct;  
    2. import javax.annotation.PreDestroy;  
    3.   
    4. import org.springframework.beans.factory.DisposableBean;  
    5. import org.springframework.beans.factory.InitializingBean;  
    6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
    7.   
    8. public class InitAndDestroySeqBean implements InitializingBean,DisposableBean {  
    9.   
    10.     public InitAndDestroySeqBean(){  
    11.         System.out.println("执行InitAndDestroySeqBean: 构造方法");  
    12.     }  
    13.       
    14.     @PostConstruct  
    15.     public void postConstruct() {    
    16.        System.out.println("执行InitAndDestroySeqBean: postConstruct");    
    17.     }    
    18.       
    19.     @Override  
    20.     public void afterPropertiesSet() throws Exception {  
    21.         System.out.println("执行InitAndDestroySeqBean: afterPropertiesSet");   
    22.     }  
    23.       
    24.     public void initMethod() {  
    25.         System.out.println("执行InitAndDestroySeqBean: init-method");  
    26.     }  
    27.   
    28.     @PreDestroy  
    29.     public void preDestroy()  {  
    30.         System.out.println("执行InitAndDestroySeqBean: preDestroy");  
    31.     }  
    32.       
    33.     @Override  
    34.     public void destroy() throws Exception {  
    35.         System.out.println("执行InitAndDestroySeqBean: destroy");  
    36.     }  
    37.       
    38.     public void destroyMethod() {  
    39.         System.out.println("执行InitAndDestroySeqBean: destroy-method");  
    40.     }  
    41.       
    42.     public static void main(String[] args) {  
    43.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("com/chj/spring/bean.xml");  
    44.         context.close();  
    45.     }  
    46. }  

    Spring配置文件:

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"    
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    4.      xmlns:context="http://www.springframework.org/schema/context"    
    5.      xsi:schemaLocation="http://www.springframework.org/schema/beans    
    6.  http://www.springframework.org/schema/beans/spring-beans-2.5.xsd    
    7.  http://www.springframework.org/schema/context    
    8.  http://www.springframework.org/schema/context/spring-context-2.5.xsd">    
    9.    
    10.    <context:annotation-config/>    
    11.      
    12.    <bean id="initAndDestroySeqBean" class="com.chj.spring.InitAndDestroySeqBean" init-method="initMethod" destroy-method="destroyMethod"/>  
    13. </beans>  

    运行InitAndDestroySeqBean的main方法,结果如下:

    1. 2013-03-03 17:11:19,098 DEBUG support.DefaultListableBeanFactory - Creating instance of bean 'initAndDestroySeqBean'  
    2. 执行InitAndDestroySeqBean: 构造方法  
    3. 2013-03-03 17:11:19,114 DEBUG annotation.CommonAnnotationBeanPostProcessor - Found init method on class [com.alibaba.chj.spring.InitAndDestroySeqBean]: public void com.alibaba.chj.spring.InitAndDestroySeqBean.postConstruct()  
    4. 2013-03-03 17:11:19,114 DEBUG annotation.CommonAnnotationBeanPostProcessor - Found destroy method on class [com.alibaba.chj.spring.InitAndDestroySeqBean]: public void com.alibaba.chj.spring.InitAndDestroySeqBean.preDestroy()  
    5. 2013-03-03 17:11:19,129 DEBUG support.DefaultListableBeanFactory - Eagerly caching bean 'initAndDestroySeqBean' to allow for resolving potential circular references  
    6. 2013-03-03 17:11:19,129 DEBUG annotation.CommonAnnotationBeanPostProcessor - Invoking init method on bean 'initAndDestroySeqBean': public void com.alibaba.chj.spring.InitAndDestroySeqBean.postConstruct()  
    7. 执行InitAndDestroySeqBean: postConstruct  
    8. 2013-03-03 17:11:19,129 DEBUG support.DefaultListableBeanFactory - Invoking afterPropertiesSet() on bean with name 'initAndDestroySeqBean'  
    9. 执行InitAndDestroySeqBean: afterPropertiesSet  
    10. 2013-03-03 17:11:19,129 DEBUG support.DefaultListableBeanFactory - Invoking init method  'initMethod' on bean with name 'initAndDestroySeqBean'  
    11. 执行InitAndDestroySeqBean: init-method  
    12. 2013-03-03 17:11:19,129 DEBUG support.DefaultListableBeanFactory - Finished creating instance of bean 'initAndDestroySeqBean'  
    13. 2013-03-03 17:11:19,129 INFO  support.ClassPathXmlApplicationContext - Closing org.springframework.context.support.ClassPathXmlApplicationContext@56a499: display name [org.springframework.context.support.ClassPathXmlApplicationContext@56a499]; startup date [Sun Mar 03 17:11:17 CST 2013]; root of context hierarchy  
    14. 2013-03-03 17:11:19,129 INFO  support.DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1292d26: defining beans [org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,initAndDestroySeqBean]; root of factory hierarchy  
    15. 2013-03-03 17:11:19,129 DEBUG annotation.CommonAnnotationBeanPostProcessor - Invoking destroy method on bean 'initAndDestroySeqBean': public void com.alibaba.chj.spring.InitAndDestroySeqBean.preDestroy()  
    16. 执行InitAndDestroySeqBean: preDestroy  
    17. 2013-03-03 17:11:19,145 DEBUG support.DisposableBeanAdapter - Invoking destroy() on bean with name 'initAndDestroySeqBean'  
    18. 执行InitAndDestroySeqBean: destroy  
    19. 2013-03-03 17:11:19,145 DEBUG support.DisposableBeanAdapter - Invoking destroy method 'destroyMethod' on bean with name 'initAndDestroySeqBean'  
    20. 执行InitAndDestroySeqBean: destroy-method  

    从执行结果可以看出:

    Bean在实例化的过程中:Constructor > @PostConstruct >InitializingBean > init-method

    Bean在销毁的过程中:@PreDestroy > DisposableBean > destroy-method

  • 相关阅读:
    SpringMvc 框架
    面试:你最大的长处和弱点分别是什么?这些长处和弱点对你在企业的业绩会有什么样的影响?
    线程、并发、并行、进程是什么,以及如何开启新的线程?
    面向对象三大特性
    一台客户端有三百个客户与三百个客户端有三百个客户对服务器施压,有什么区别?
    JavaScript 引擎
    Spring Data JPA简介 Spring Data JPA特点
    redo log 有什么作用?
    Spring的简介和优点?
    学习笔记——享元模式Flyweight
  • 原文地址:https://www.cnblogs.com/kimobolo/p/7059888.html
Copyright © 2011-2022 走看看