注解@PostConstruct与@PreDestroy讲解及实例

本文介绍了JavaEE5规范中新增的@PostConstruct和@PreDestroy注解,它们用于标记非静态void方法,分别在Servlet初始化前后执行特定任务。@PostConstruct通常用于替代构造函数初始化操作,而@PreDestroy则用于资源清理。

从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;  
        }  
    }  
      
}

1、@controller 控制器(注入服务) 2、@service 服务(注入dao) 3、@repository dao(实现dao访问) 4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)

@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。 下面写这个是引入component的扫描组件 <context:component-scan base-package=”com.mmnc”>

其中base-package为需要扫描的包(含所有子包) 1、@Service用于标注业务层组件 2、@Controller用于标注控制层组件(如struts中的action) 3、@Repository用于标注数据访问组件,即DAO组件. 4、@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Service public class UserServiceImpl implements UserService { } @Repository public class UserDaoImpl implements UserDao { } getBean的默认名称是类名(头字母小写),如果想自定义,可以@Service(“***”) 这样来指定,这种bean默认是单例的,如果想改变,可以使用@Service(“beanName”) @Scope(“prototype”)来改变。可以使用以下方式指定初始化方法和销毁方法(方法名任意): @PostConstruct public void init() { }

转载于:https://my.oschina.net/ruanjun/blog/829325

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值