通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作

时间:2021-11-13 21:46:44

关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种:

第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作

第二种是:通过 在xml中定义init-method 和  destory-method方法

第三种是: 通过bean实现InitializingBean和 DisposableBean接口


下面演示通过  @PostConstruct 和 @PreDestory

1:定义相关的实现类:

[java] view plain copy
  1. package com.myapp.core.annotation.init;  
  2.   
  3. import javax.annotation.PostConstruct;  
  4. import javax.annotation.PreDestroy;  
  5.   
  6. public class PersonService {  
  7.     
  8.     private String  message;  
  9.   
  10.     public String getMessage() {  
  11.         return message;  
  12.     }  
  13.   
  14.     public void setMessage(String message) {  
  15.         this.message = message;  
  16.     }  
  17.       
  18.     @PostConstruct  
  19.     public void  init(){  
  20.         System.out.println("I'm  init  method  using  @PostConstrut...."+message);  
  21.     }  
  22.       
  23.     @PreDestroy  
  24.     public void  dostory(){  
  25.         System.out.println("I'm  destory method  using  @PreDestroy....."+message);  
  26.     }  
  27.       
  28. }  

2:定义相关的配置文件:

[html] view plain copy
  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-3.1.xsd  
  7. http://www.springframework.org/schema/context  
  8. http://www.springframework.org/schema/context/spring-context-3.1.xsd">  
  9.   
  10. <!-- <context:component-scan  base-package="com.myapp.core.jsr330"/> -->  
  11.   
  12. <context:annotation-config />  
  13.   
  14. <bean id="personService" class="com.myapp.core.annotation.init.PersonService">  
  15.   <property name="message" value="123"></property>  
  16. </bean>  
  17.   
  18. </beans>  

其中<context:annotation-config />告诉spring 容器采用注解配置:扫描注解配置;

测试类:

[java] view plain copy
  1. package com.myapp.core.annotation.init;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class MainTest {  
  7.       
  8.     public static void main(String[] args) {  
  9.           
  10.         ApplicationContext  context = new ClassPathXmlApplicationContext("resource/annotation.xml");  
  11.           
  12.         PersonService   personService  =  (PersonService)context.getBean("personService");  
  13.           
  14.         personService.dostory();  
  15.     }  
  16.   
  17. }  

测试结果:

I'm  init  method  using  @PostConstrut....123
I'm  destory method  using  @PreDestroy.....123


其中也可以通过申明加载org.springframework.context.annotation.CommonAnnotationBeanPostProcessor

类来告诉Spring容器采用的 常用 注解配置的方式:

只需要修改配置文件为:

[html] view plain copy
  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-3.1.xsd  
  7. http://www.springframework.org/schema/context  
  8. http://www.springframework.org/schema/context/spring-context-3.1.xsd">  
  9.   
  10. <!-- <context:component-scan  base-package="com.myapp.core.jsr330"/> -->  
  11.   
  12. <!-- <context:annotation-config /> -->  
  13.   
  14.   
  15. <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />  
  16. <bean id="personService" class="com.myapp.core.annotation.init.PersonService">  
  17.           <property name="message" value="123"></property>  
  18. </bean>  
  19.   
  20.   
  21.   
  22. </beans>  

同样可以得到以上测试的输出结果。



转载另一篇 

关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种:

第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作

第二种是:通过 在xml中定义init-method 和  destory-method方法

第三种是: 通过bean实现InitializingBean和 DisposableBean接口


1:定义相应类实现InitializingBean ,DisposableBean 接口

[java] view plain copy
  1. package com.myapp.core.annotation.init;  
  2.   
  3. import javax.annotation.PostConstruct;  
  4. import javax.annotation.PreDestroy;  
  5.   
  6. import org.springframework.beans.factory.DisposableBean;  
  7. import org.springframework.beans.factory.InitializingBean;  
  8.   
  9. public class PersonService  implements InitializingBean,DisposableBean{  
  10.     
  11.     private String  message;  
  12.   
  13.     public String getMessage() {  
  14.         return message;  
  15.     }  
  16.   
  17.     public void setMessage(String message) {  
  18.         this.message = message;  
  19.     }  
  20.   
  21.     @Override  
  22.     public void destroy() throws Exception {  
  23.         // TODO Auto-generated method stub  
  24.         System.out.println("I'm  init  method  using implements InitializingBean interface...."+message);  
  25.           
  26.     }  
  27.   
  28.     @Override  
  29.     public void afterPropertiesSet() throws Exception {  
  30.         // TODO Auto-generated method stub  
  31.         System.out.println("I'm  init  method  using implements DisposableBean interface...."+message);  
  32.           
  33.     }  
  34.       
  35.   
  36. }  

2:定义相应的配置文件:

[java] view plain copy
  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-3.1.xsd  
  7. http://www.springframework.org/schema/context  
  8. http://www.springframework.org/schema/context/spring-context-3.1.xsd">  
  9.   
  10. <!-- <context:component-scan  base-package="com.myapp.core.jsr330"/> -->  
  11.   
  12. <!-- <context:annotation-config /> -->  
  13.   
  14.   
  15. <!-- <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />  
  16. <bean id="personService" class="com.myapp.core.annotation.init.PersonService">  
  17.           <property name="message" value="123"></property>  
  18. </bean>  
  19.  -->  
  20.   
  21. <bean id="personService" class="com.myapp.core.annotation.init.PersonService">  
  22.           <property name="message" value="123"></property>  
  23. </bean>  
  24.   
  25. </beans>  

3:测试类:

[java] view plain copy
  1. package com.myapp.core.annotation.init;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.AbstractApplicationContext;  
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6.   
  7. public class MainTest {  
  8.       
  9.     public static void main(String[] args) {  
  10.           
  11.         AbstractApplicationContext  context = new ClassPathXmlApplicationContext("resource/annotation.xml");  
  12.           
  13.         PersonService   personService  =  (PersonService)context.getBean("personService");  
  14.           
  15.              context.registerShutdownHook();  
  16.     }  
  17.   
  18. }  

4:输出测试结果:

[plain] view plain copy
  1. I'm  init  method  using implements DisposableBean interface....123  
  2. 三月 16, 2013 5:06:34 下午 org.springframework.context.support.AbstractApplicationContext doClose  
  3. INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext@205756: startup date [Sat Mar 16 17:06:30 CST 2013]; root of context hierarchy  
  4. I'm  init  method  using implements InitializingBean interface....123  
转载另一篇 

从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion);@PostConstruct和@PreDestroy。这两个注解被用来修饰一个非静态的void()方法 。写法有如下两种方式:

@PostConstruct

Public void someMethod() {}
                                                                                    
或者

public @PostConstruct void someMethod(){}

    被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行

 

通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作

 

 

被注解的Servlet生命周期

    需要注意的是,注解会多多少少地影响到服务器的启动速度。服务器在启动时候会遍历Web 应用的WEB-INF/classes下的所有class文件与WEB-INF/lib下的所有jar文件,以检查哪些类使用了注解。如果应用程序中没有 使用任何注解,可以在Web.xml中设置的metadata-complete属性为true.(支持@PostConstruct和 @PreDestroy的服务器需要支持Servlet2.5规范。Tomcat5.x仅支持Servlet2.4规范。)


我现在要说的是用实例说明它有什么作用。

比如说我有一种情况,在我的servlet初始化加载之前我想处理一些东西,像加载缓存等等。

怎么做。@PostConstruct就派上用场了。那为什么这玩意用的不多呢,这是因为如果初始化之前我们要加载或处理某些玩意完全可以在构造器初始化时就处理了,但这种方法需要自己重写构造器。好吧。直接上代码看看具体用它的时候怎么做的。

[java] view plain copy print?
  1. package com.whaty.products.whatysns.web.info;  
  2.   
  3. import javax.annotation.PostConstruct;  
  4. import javax.annotation.Resource;  
  5.   
  6. import org.springframework.stereotype.Service;  
  7. import org.springframework.util.Assert;  
  8.   
  9. import com.whaty.framework.cache.core.model.Cache;  
  10. import com.whaty.framework.cache.core.service.CacheService;  
  11. import com.whaty.framework.cache.entitycache.service.EntityCacheHelper;  
  12. import com.whaty.framework.cache.entitycache.service.IEntityDaoAdapter;  
  13.   
  14. /** 
  15.  * @author bc_qi 
  16.  * @param <KEY> 
  17.  * @param <ENTITY> 
  18.  */  
  19. @Service("AjaxCacheableService")  
  20. public class AjaxCacheableService{  
  21.       
  22.     @Resource(name="cacheService")  
  23.     protected CacheService cacheService;  
  24.       
  25.     protected boolean useReadWriteEntityDao = false;  
  26.     protected boolean useCache = true;  
  27.     protected int entityCacheMaxSize = 1000;  
  28.     protected int entityCacheMaxLiveSeconds = 3600;  
  29.     protected Cache entityCache;  
  30.       
  31.       
  32.     /** 
  33.      * 构造方法执行后,初始化, 
  34.      */  
  35.     @PostConstruct  
  36.     public void init() {  
  37.         Assert.notNull(cacheService, "cacheService must be set!");  
  38.         getCache();  
  39.     }  
  40.   
  41.     /** 
  42.      * 获取cache 
  43.      * @return 
  44.      */  
  45.     protected Cache getCache() {  
  46.         if (entityCache == null) {  
  47.             entityCache = cacheService.addCache(this.getClass().getName(),entityCacheMaxLiveSeconds);  
  48.         }  
  49.         return entityCache;  
  50.     }  
  51.       
  52.     /** 
  53.      * @param id 
  54.      * @param useCache 是否使用Cache 
  55.      * @return 
  56.      */  
  57.     public Object getCache(String id) {  
  58.         String strid = String.valueOf(id);  
  59.         Object o = entityCache.get(strid);  
  60.         return  o;  
  61.     }  
  62.       
  63.     public Object putCache(int tTLSeconds,String cacheId,Object value) {  
  64.         String strid = String.valueOf(cacheId);  
  65.         Object o = entityCache.get(strid);  
  66.         if (o != null) {  
  67.             return  o;  
  68.         } else {  
  69.             entityCache.put(strid, value, tTLSeconds);  
  70.             return value;  
  71.         }  
  72.     }  
  73.       
  74. }  
通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作