一般作法是定義一個Servlet,並在web.xml中配置Servlet的啓動順序<load-on-startup>的值在DispatcherServlet以後。但這樣作的缺點是在Servlet中沒法使用Spring的依賴注入功能,只能使用WebApplicationContext的getBean()方法獲取bean。 html
找到的解決辦法以下: java
一、自定義一個用於代理啓動Servlet的類DelegatingServletProxy: web
package cn.edu.swu.oa.common.util; import java.io.IOException; import javax.servlet.GenericServlet; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; public class DelegatingServletProxy extends GenericServlet { private String targetBean; private Servlet proxy; @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { proxy.service(arg0, arg1); } @Override public void init() throws ServletException { this.targetBean = getServletName(); getServletBean(); proxy.init(getServletConfig()); } private void getServletBean() { WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); this.proxy = (Servlet)wac.getBean(targetBean); } }
二、編寫啓動Servlet: spring
package cn.edu.swu.oa.common.util; import java.io.IOException; import java.util.List; import javax.annotation.Resource; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import cn.edu.swu.oa.agency.model.Department; import cn.edu.swu.oa.agency.model.Group; import cn.edu.swu.oa.agency.service.DepService; import cn.edu.swu.oa.agency.service.GroService; import cn.edu.swu.oa.common.model.SysCode; import cn.edu.swu.oa.safe.model.User; import cn.edu.swu.oa.safe.service.UserService; /** * * 工程:WebOA * 類型解釋:Spring啓動完成後執行初始化操做 * 類型表述:預讀某些實體的Key-Value,放入map,方便之後使用 * @author ChenGuanwei * @version 建立時間:2010-3-25 下午10:55:44 * */ @Component("initialServlet") public class InitialServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Resource private UserService userService; @Resource private DepService depService; @Resource private GroService groService; /** * @see HttpServlet#HttpServlet() */ public InitialServlet() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } @Override public void init(ServletConfig config) throws ServletException { //初始化eserMap List<User> users = userService.getUsers(); for(int i = 0; i < users.size(); i++) { User user = users.get(i); Integer userId = user.getUserId(); String userName = user.getUserName(); SysCode.userMap.put(userId, userName); } //初始化depMap List<Department> deps = depService.getAllDeps(); for(int i = 0; i < deps.size(); i++) { Department dep = deps.get(i); Integer depId = dep.getDepId(); String depName = dep.getDepName(); SysCode.depMap.put(depId, depName); } //初始化groMap List<Group> gros = groService.getAllGroups(); for(int i = 0; i < gros.size(); i++) { Group gro = gros.get(i); Integer groId = gro.getGroId(); String groName = gro.getGroName(); SysCode.groMap.put(groId, groName); } } }
在web.xml文件中配置InitialServlet :
<servlet> <description></description> <display-name>InitialServlet</display-name> <servlet-name>initialServlet</servlet-name> <servlet-class>cn.edu.swu.oa.common.util.
DelegatingServletProxy app
</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>initialServlet</servlet-name> <url-pattern>/InitialServlet</url-pattern> </servlet-mapping>
完成這些操做後,就能夠在Spring容器啓動後執行自定義的Servlet,而且在自定義Servlet中能夠使用Spring Annotation的自動注入功能。 ide
備註:須要在xml裏面配置compont掃描:示例 ui
<context:component-scan base-package="com.et59.cus"/>