Spring容器啟動後注入service到Servlet並自動執行
阿新 • • 發佈:2019-01-09
以下內容摘取自網路,其中有部分沒說清楚,這邊加以說明
通常做法是定義一個Servlet,並在web.xml中配置Servlet的啟動順序<load-on-startup>的值在DispatcherServlet之後。但這樣做的缺點是在Servlet中無法使用Spring的依賴注入功能,只能使用WebApplicationContext的getBean()方法獲取bean。
找到的解決辦法如下:
1、自定義一個用於代理啟動Servlet的類DelegatingServletProxy:
2、編寫啟動Servlet: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); } }
package com.gszh.wmcp.project.distribution.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.gszh.wmcp.project.distribution.service.TestQueryService; @Component("InitParamServlet") public class InitParamServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; /** * Tomcat伺服器啟動時馬上執行ServerMain.start(),啟動相關執行緒 */ @Autowired private TestQueryService queryAction; @Override public void init() throws ServletException { super.init(); Start(); } //開始啟動 public void Start(){ queryAction.query(); } }
3:配置Web。
//<servlet-name>InitParamServlet</servlet-name>這一行的名字在執行的servlet的頭部@Component("InitParamServlet")定義<servlet-mapping> <servlet-name>wap</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>InitParamServlet</servlet-name> <servlet-class>com.gszh.wmcp.project.distribution.unit.DelegatingServletProxy</servlet-class> <load-on-startup>5</load-on-startup> </servlet>