普通静态类方法获取Spring注入的Been实体

原本想要在静态方法中获取Spring注解后的Been,发现给Been字段添加static关键字后,启动tomcat报错-------错误大意是说静态字段不能注解。

然后google下,解决方法如下:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.sondon.dev_info.controller;  
  2.   
  3. import javax.annotation.PostConstruct;  
  4. import javax.annotation.PreDestroy;  
  5. import javax.annotation.Resource;  
  6.   
  7. import org.springframework.stereotype.Controller;  
  8.   
  9. import com.sondon.dev_info.entity.DevInfo;  
  10. import com.sondon.dev_info.service.TemplateManager;  
  11.   
  12. /** 
  13.  * @Project : Dev_Info_Web 
  14.  * @Package : com.sondon.dev_info.controller 
  15.  * @Class : Dev_Info.java 
  16.  * @Company 广州讯动网络科技有限公司 
  17.  * @Author : 蔡文锋 
  18.  * @DateTime:2015年4月24日 下午1:39:58 
  19.  * @Blog:http://blog.csdn.net/caiwenfeng_for_23 
  20.  * @Description : {} 
  21.  */  
  22.   
  23. @Controller  
  24. public class Dev_InfoController {  
  25.     @Resource  
  26.     public TemplateManager<DevInfo> templateManager;  
  27.     private static Dev_InfoController dev_infoController;  
  28.       
  29.     /** 
  30.      * 构造方法执行后调用 init() 
  31.      */  
  32.     @PostConstruct  
  33.     public void init() {  
  34.           System.out.println("I'm  init  method  using  @PostConstrut....");    
  35.         dev_infoController = this;  
  36.         dev_infoController.templateManager = this.templateManager;  
  37.     }  
  38.     /** 
  39.      *  servlet销毁前调用dostory() 
  40.      */  
  41.     @PreDestroy    
  42.     public void  dostory(){    
  43.         System.out.println("I'm  destory method  using  @PreDestroy.....");    
  44.     }    
  45.   
  46.     public static void Add_DevInfo(DevInfo devinfo) {  
  47.   
  48.         // boolean result=false;  
  49.         dev_infoController.templateManager.add(devinfo);  
  50.         // return result;  
  51.     }  
  52.   
  53.     /** 
  54.      * @param templateManager 
  55.      *            the templateManager to set 
  56.      */  
  57.     public void setTemplateManager(TemplateManager<DevInfo> templateManager) {  
  58.         this.templateManager = templateManager;  
  59.     }  
  60. }  

从上面可以看到使用了@PostConstruct ,   然后在静态方法 Add_DevInfo(DevInfo devinfo)调用了  templateManager 


从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 ? 在CODE上查看代码片 派生到我的代码片
  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. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值