分享

spring 在web容器启动时执行初始化方法

 Erica_Shea 2014-06-01

需求说明:最近设计了一个“权限管理系统”,在用户登录的时候就需要知道用户对资源所拥有的权限,如果每个用户在登录的时候去查询对应的表(8 张),因此对数据库和系统都是极大的负担,因此想缓存用户权限相关表的数据,以后在其余用户登录的时候去找相关的缓存数据,而不是去查询表了

 

开发框架:spingMVC+myBatis

 

解决方案:给web容器添加一个Listener类,在容器启动的时候执行Listener的“初始化”方法,在这个初始化方法中执行查询数据库的所有操作,然后将数据库中的信息缓存起来

 

问题:上面的方法很好,但问题是如何去查询数据库,由于使用了spring的IOC特性,查询数据库的service控制dao层,dao层访问数 据库,而Listener类只是在系统启动的时候会执行初始化方法,但是“service”对象没有被spring管理,也就是说没有service对象 访问数据库,只能使用jdbc的方式连接,这个很显然不符合MVC开发的特性。那么如何才能在启动web容器的时候利用spring的IOC特性呢?

 

解决方法:spring给出的解决方案——写一个类,实现InitializingBean接口,然后交由spring容器管理

 

Java代码  收藏代码
  1. public class InitDataListener implements InitializingBean, ServletContextAware{  
  2.   
  3.     private UserService userService;//属性。和配置文件对应property name对应  
  4.     private Logger log = Logger.getLogger(InitDataListener.class);  
  5.       
  6.     public UserService getUserService() {  
  7.         return userService;  
  8.     }  
  9.     public void setUserService(UserService userService) {  
  10.         this.userService = userService;  
  11.     }  
  12.   
  13.     @Override  
  14.     public void afterPropertiesSet() throws Exception {  
  15.         //在这个方法里面写 初始化的数据也可以。  
  16.           
  17.     }  
  18.     @Override  
  19.     public void setServletContext(ServletContext arg0) {  
  20.           
  21.         //userMap容器存放 userList(用户数据)  
  22.         List<User> userList = new ArrayList<User>();   
  23.         try {  
  24.             userList = userService.queryAllUser();  
  25.             Map<String, Object> userMap = CachFactory.getInstance().createCach("userMap");  
  26. //一个工厂模式和单例模式的使用。文档最后有代码  
  27.             for(User user:userList){  
  28.                 userMap.put(user.getUserid(), user);  
  29.             }  
  30.               
  31.         } catch (Exception e) {  
  32.             log.error("queryAllUser error系统初始化查询所有用户出错");  
  33.         }  
  34.           
  35.     System.out.println(userList.size());  
  36.   
  37. }  

 

Java代码  收藏代码
  1. <!-- spring系统启动以后,加载该类,查询所有数据    -->  
  2. <bean class="adtec.init.InitDataListener">  
  3.     <property name="userService" ref="userService"></property>  
  4. </bean>  

 

备注:userService这个类实际上也是被spring管理了的,他管理的dao层是操作数据库的,这里我就不贴上代码了,只是说明一下这种解决方案和思想。

 

关于CachFactory类(缓存多个不同类型的数据)请参考 

http://hbiao68./blog/2026169

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多