您的位置:首页 > 编程语言 > Java开发

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

2016-09-27 17:08 831 查看
关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种:

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

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

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

下面演示通过  @PostConstruct 和 @PreDestory

1:定义相关的实现类:

[java] view
plain copy

package com.myapp.core.annotation.init;  

  

import javax.annotation.PostConstruct;  

import javax.annotation.PreDestroy;  

  

public class PersonService {  

    

    private String  message;  

  

    public String getMessage() {  

        return message;  

    }  

  

    public void setMessage(String message) {  

        this.message = message;  

    }  

      

    @PostConstruct  

    public void  init(){  

        System.out.println("I'm  init  method  using  @PostConstrut...."+message);  

    }  

      

    @PreDestroy  

    public void  dostory(){  

        System.out.println("I'm  destory method  using  @PreDestroy....."+message);  

    }  

      

}  

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

[html] view
plain copy

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

xmlns:context="http://www.springframework.org/schema/context"  

xsi:schemaLocation="http://www.springframework.org/schema/beans  
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd   http://www.springframework.org/schema/context   http://www.springframework.org/schema/context/spring-context-3.1.xsd">  
  

<!-- <context:component-scan  base-package="com.myapp.core.jsr330"/> -->  

  

<context:annotation-config />  

  

<bean id="personService" class="com.myapp.core.annotation.init.PersonService">  

  <property name="message" value="123"></property>  

</bean>  

  

</beans>  

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

测试类:

[java] view
plain copy

package com.myapp.core.annotation.init;  

  

import org.springframework.context.ApplicationContext;  

import org.springframework.context.support.ClassPathXmlApplicationContext;  

  

public class MainTest {  

      

    public static void main(String[] args) {  

          

        ApplicationContext  context = new ClassPathXmlApplicationContext("resource/annotation.xml");  

          

        PersonService   personService  =  (PersonService)context.getBean("personService");  

          

        personService.dostory();  

    }  

  

}  

测试结果:

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

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

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

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

只需要修改配置文件为:

[html] view
plain copy

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

xmlns:context="http://www.springframework.org/schema/context"  

xsi:schemaLocation="http://www.springframework.org/schema/beans  
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd   http://www.springframework.org/schema/context   http://www.springframework.org/schema/context/spring-context-3.1.xsd">  
  

<!-- <context:component-scan  base-package="com.myapp.core.jsr330"/> -->  

  

<!-- <context:annotation-config /> -->  

  

  

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />  

<bean id="personService" class="com.myapp.core.annotation.init.PersonService">  

          <property name="message" value="123"></property>  

</bean>  

  

  

  

</beans>  

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

转载另一篇 


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

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

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

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

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

[java] view
plain copy

package com.myapp.core.annotation.init;  

  

import javax.annotation.PostConstruct;  

import javax.annotation.PreDestroy;  

  

import org.springframework.beans.factory.DisposableBean;  

import org.springframework.beans.factory.InitializingBean;  

  

public class PersonService  implements InitializingBean,DisposableBean{  

    

    private String  message;  

  

    public String getMessage() {  

        return message;  

    }  

  

    public void setMessage(String message) {  

        this.message = message;  

    }  

  

    @Override  

    public void destroy() throws Exception {  

        // TODO Auto-generated method stub  

        System.out.println("I'm  init  method  using implements InitializingBean interface...."+message);  

          

    }  

  

    @Override  

    public void afterPropertiesSet() throws Exception {  

        // TODO Auto-generated method stub  

        System.out.println("I'm  init  method  using implements DisposableBean interface...."+message);  

          

    }  

      

  

}  

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

[java] view
plain copy

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

xmlns:context="http://www.springframework.org/schema/context"  

xsi:schemaLocation="http://www.springframework.org/schema/beans  
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd   http://www.springframework.org/schema/context   http://www.springframework.org/schema/context/spring-context-3.1.xsd">  
  

<!-- <context:component-scan  base-package="com.myapp.core.jsr330"/> -->  

  

<!-- <context:annotation-config /> -->  

  

  

<!-- <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />  

<bean id="personService" class="com.myapp.core.annotation.init.PersonService">  

          <property name="message" value="123"></property>  

</bean>  

 -->  

  

<bean id="personService" class="com.myapp.core.annotation.init.PersonService">  

          <property name="message" value="123"></property>  

</bean>  

  

</beans>  

3:测试类:

[java] view
plain copy

package com.myapp.core.annotation.init;  

  

import org.springframework.context.ApplicationContext;  

import org.springframework.context.support.AbstractApplicationContext;  

import org.springframework.context.support.ClassPathXmlApplicationContext;  

  

public class MainTest {  

      

    public static void main(String[] args) {  

          

        AbstractApplicationContext  context = new ClassPathXmlApplicationContext("resource/annotation.xml");  

          

        PersonService   personService  =  (PersonService)context.getBean("personService");  

          

             context.registerShutdownHook();  

    }  

  

}  

4:输出测试结果:

[plain] view
plain copy

I'm  init  method  using implements DisposableBean interface....123  

三月 16, 2013 5:06:34 下午 org.springframework.context.support.AbstractApplicationContext doClose  

INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext@205756: startup date [Sat Mar 16 17:06:30 CST 2013]; root of context hierarchy  

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()方法执行执行之后执行

 



 

 

被注解的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?

package com.whaty.products.whatysns.web.info;  

  

import javax.annotation.PostConstruct;  

import javax.annotation.Resource;  

  

import org.springframework.stereotype.Service;  

import org.springframework.util.Assert;  

  

import com.whaty.framework.cache.core.model.Cache;  

import com.whaty.framework.cache.core.service.CacheService;  

import com.whaty.framework.cache.entitycache.service.EntityCacheHelper;  

import com.whaty.framework.cache.entitycache.service.IEntityDaoAdapter;  

  

/** 

 * @author bc_qi 

 * @param <KEY> 

 * @param <ENTITY> 

 */  

@Service("AjaxCacheableService")  

public class AjaxCacheableService{  

      

    @Resource(name="cacheService")  

    protected CacheService cacheService;  

      

    protected boolean useReadWriteEntityDao = false;  

    protected boolean useCache = true;  

    protected int entityCacheMaxSize = 1000;  

    protected int entityCacheMaxLiveSeconds = 3600;  

    protected Cache entityCache;  

      

      

    /** 

     * 构造方法执行后,初始化, 

     */  

    @PostConstruct  

    public void init() {  

        Assert.notNull(cacheService, "cacheService must be set!");  

        getCache();  

    }  

  

    /** 

     * 获取cache 

     * @return 

     */  

    protected Cache getCache() {  

        if (entityCache == null) {  

            entityCache = cacheService.addCache(this.getClass().getName(),entityCacheMaxLiveSeconds);  

        }  

        return entityCache;  

    }  

      

    /** 

     * @param id 

     * @param useCache 是否使用Cache 

     * @return 

     */  

    public Object getCache(String id) {  

        String strid = String.valueOf(id);  

        Object o = entityCache.get(strid);  

        return  o;  

    }  

      

    public Object putCache(int tTLSeconds,String cacheId,Object value) {  

        String strid = String.valueOf(cacheId);  

        Object o = entityCache.get(strid);  

        if (o != null) {  

            return  o;  

        } else {  

            entityCache.put(strid, value, tTLSeconds);  

            return value;  

        }  

    }  

      

}  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐