Spring容器启动后注入service到Servlet并自动执行

以下内容摘取自网络,其中有部分没说清楚,这边加以说明

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

找到的解决办法如下:

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

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);
	}

}
2、编写启动Servlet:

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-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>
//<servlet-name>InitParamServlet</servlet-name>这一行的名字在执行的servlet的头部@Component("InitParamServlet")定义

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值