SpringMVC启动后自动执行

来源:互联网 发布:郑州传智播客开java 编辑:程序博客网 时间:2024/06/10 08:17

参考:http://kylin755.iteye.com/blog/1703542


通常做法是定义一个Servlet,并在web.xml中配置Servlet的启动顺序<load-on-startup>的值在DispatcherServlet之后。但这样做的缺点是在Servlet中无法使用Spring的依赖注入功能,只能使用WebApplicationContext的getBean()方法获取bean。 

找到的解决办法如下: 

1、自定义一个用于代理启动Servlet的类DelegatingServletProxy: 

Java代码  收藏代码
  1. package com.test.common.util;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.GenericServlet;  
  6. import javax.servlet.Servlet;  
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.ServletRequest;  
  9. import javax.servlet.ServletResponse;  
  10.   
  11. import org.springframework.web.context.WebApplicationContext;  
  12. import org.springframework.web.context.support.WebApplicationContextUtils;  
  13.   
  14. public class DelegatingServletProxy extends GenericServlet {  
  15.   
  16.     private String targetBean;  
  17.     private Servlet proxy;  
  18.       
  19.     @Override  
  20.     public void service(ServletRequest arg0, ServletResponse arg1)  
  21.             throws ServletException, IOException {  
  22.         proxy.service(arg0, arg1);  
  23.     }  
  24.   
  25.     @Override  
  26.     public void init() throws ServletException {  
  27.         this.targetBean = getServletName();  
  28.         getServletBean();  
  29.         proxy.init(getServletConfig());  
  30.     }  
  31.       
  32.     private void getServletBean() {  
  33.         WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());  
  34.         this.proxy = (Servlet)wac.getBean(targetBean);  
  35.     }  
  36. }  


2、编写启动Servlet:
Java代码  收藏代码
  1. package com.test.common.util;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.List;  
  5.   
  6. import javax.annotation.Resource;  
  7. import javax.servlet.ServletConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.http.HttpServlet;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12.   
  13. import org.springframework.stereotype.Component;  
  14.   
  15. import cn.edu.swu.oa.agency.model.Department;  
  16. import cn.edu.swu.oa.agency.model.Group;  
  17. import cn.edu.swu.oa.agency.service.DepService;  
  18. import cn.edu.swu.oa.agency.service.GroService;  
  19. import cn.edu.swu.oa.common.model.SysCode;  
  20. import cn.edu.swu.oa.safe.model.User;  
  21. import cn.edu.swu.oa.safe.service.UserService;  
  22.   
  23. /** 
  24.  *  
  25.  * 
  26.  * 类型解释:Spring启动完成后执行初始化操作 
  27.  * 类型表述:预读某些实体的Key-Value,放入map,方便以后使用 
  28.  * @author  
  29.  * @version  
  30.  * 
  31.  */  
  32. @Component("initialServlet")  
  33. public class InitialServlet extends HttpServlet {  
  34.     private static final long serialVersionUID = 1L;  
  35.       
  36.     @Resource  
  37.     private UserService userService;  
  38.       
  39.     @Resource  
  40.     private DepService depService;  
  41.          
  42.     @Resource  
  43.     private GroService groService;  
  44.       
  45.     /** 
  46.      * @see HttpServlet#HttpServlet() 
  47.      */  
  48.     public InitialServlet() {  
  49.         super();  
  50.     }  
  51.   
  52.     /** 
  53.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
  54.      */  
  55.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  56.           
  57.     }  
  58.   
  59.     /** 
  60.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
  61.      */  
  62.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  63.         // TODO Auto-generated method stub  
  64.     }  
  65.   
  66.     @Override  
  67.     public void init(ServletConfig config) throws ServletException {  
  68.         //初始化eserMap  
  69.         List<User> users = userService.getUsers();  
  70.         for(int i = 0; i < users.size(); i++) {  
  71.             User user = users.get(i);  
  72.             Integer userId = user.getUserId();  
  73.             String userName = user.getUserName();  
  74.             SysCode.userMap.put(userId, userName);  
  75.         }  
  76.         //初始化depMap  
  77.         List<Department> deps = depService.getAllDeps();  
  78.         for(int i = 0; i < deps.size(); i++) {  
  79.             Department dep = deps.get(i);  
  80.             Integer depId = dep.getDepId();  
  81.             String depName = dep.getDepName();  
  82.             SysCode.depMap.put(depId, depName);  
  83.         }  
  84.         //初始化groMap  
  85.         List<Group> gros = groService.getAllGroups();  
  86.         for(int i = 0; i < gros.size(); i++) {  
  87.             Group gro = gros.get(i);  
  88.             Integer groId = gro.getGroId();  
  89.             String groName = gro.getGroName();  
  90.             SysCode.groMap.put(groId, groName);  
  91.         }  
  92.     }  
  93.   
  94. }  

3. 在web.xml文件中配置InitialServlet : 
Xml代码  收藏代码
  1. <servlet>  
  2.     <description></description>  
  3.     <display-name>InitialServlet</display-name>  
  4.     <servlet-name>initialServlet</servlet-name>  
  5.     <servlet-class>  
  6.             com.test.common.util.DelegatingServletProxy   
  7.     </servlet-class>  
  8.     <load-on-startup>2</load-on-startup>  
  9. </servlet>  
  10. <servlet-mapping>  
  11.     <servlet-name>initialServlet</servlet-name>  
  12.     <url-pattern>/InitialServlet</url-pattern>  
  13. </servlet-mapping>  

完成这些操作后,就可以在Spring容器启动后执行自定义的Servlet,并且在自定义Servlet中可以使用Spring Annotation的自动注入功能。 <script></script>

0 0
原创粉丝点击