[转]Spring容器启动后自动执行Servlet进行预处理

标签: | 发表时间:2015-04-06 19:41 | 作者:HEYUTAO007
出处:http://blog.csdn.net/heyutao007

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


找到的解决办法如下:
1、自定义一个用于代理启动Servlet的类DelegatingServletProxy:
package com.xxxx;


import java.io.IOException;  
  
import javax.servlet.Servlet;  
import javax.servlet.ServletContext;  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import org.springframework.web.context.WebApplicationContext;  
import org.springframework.web.context.support.WebApplicationContextUtils;  
  
public class DelegatingServletProxy extends HttpServlet {  
    private static final long serialVersionUID = 1L;  
    private String targetServletBean;  
    private Servlet proxy;  
      
    @Override  
    public void init() throws ServletException {  
        this.targetServletBean = this.getInitParameter("targetServletBean");  
        this.getServletBean();  
        this.proxy.init(this.getServletConfig());  
    }  
  
    @Override  
    protected void service(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        proxy.service(request,response);   
    }  
  
    private void getServletBean(){  
        ServletContext servletContext = this.getServletContext();  
        WebApplicationContext wac = null;   
        wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);  
        this.proxy = (Servlet) wac.getBean(targetServletBean);  
    }  
}  


2、不同于一般的 Servlet 在 web.xml 中的配置,需要配置的是 Servlet 代理类,而非 Servlet:
<servlet>  
    <servlet-name>proxyServletBean</servlet-name>  
    <servlet-class>com.xxxx.DelegatingServletProxy</servlet-class>  
    <init-param>  
        <param-name>targetServletBean</param-name>  
        <param-value>myBean</param-value>  
    </init-param>  
    <load-on-startup>2</load-on-startup>
</servlet>      
<servlet-mapping>  
    <servlet-name>proxyServletBean</servlet-name>  
    <url-pattern>/file</url-pattern>  
</servlet-mapping>  

3、用spring bean的方式定义名字是myBean的servlet。如同一般的 Servlet 我们的这个 MyServlet 需要继承 GenericServlet 或者 HttpServlet:
@Component("myBean")
public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	@Resource
	private UserService userService;
	
	
    /**
     * @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);
		}
	}
}


4、如果是多个 Servlet 的话,可以共用同一个代理 Servlet。Servlet 代码和代理 Servlet 代码无须改变,只需要注意一下在 web.xml 里的配置即可:
<servlet>  
    <servlet-name>proxyServletBean2</servlet-name>  
    <servlet-class>com.xxxx.DelegatingServletProxy</servlet-class>  
    <init-param>  
        <param-name>targetServletBean</param-name>  
        <param-value>myBean2</param-value>  
    </init-param>  
</servlet>      
<servlet-mapping>  
    <servlet-name>proxyServletBean2</servlet-name>  
    <url-pattern>/file2</url-pattern>  
</servlet-mapping>      
  
<servlet>  
    <servlet-name>proxyServletBean3</servlet-name>  
    <servlet-class>com.xxxx.DelegatingServletProxy</servlet-class>  
    <init-param>  
        <param-name>targetServletBean</param-name>  
        <param-value>myBean3</param-value>  
    </init-param>  
</servlet>      
<servlet-mapping>  
    <servlet-name>proxyServletBean3</servlet-name>  
    <url-pattern>/WebService</url-pattern>  
</servlet-mapping>      


作者:HEYUTAO007 发表于2015/4/6 11:41:26 原文链接
阅读:5 评论:0 查看评论

相关 [spring 容器 自动执行] 推荐:

[转]Spring容器启动后自动执行Servlet进行预处理

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

docker容器部署Spring Boot项目及更新

- - 编程语言 - ITeye博客
Docker这项容器技术已经是十分的火热了,读者要是不了解docker的话可以吧docker先理解为虚拟机. 我们的Springboot最终是要部署在Linux上的,docker作为Linux轻量级的实现. docker也是可以用来部署Springboot应用的. 1.创建Dockerfile . 创建一个文件名为Dockerfile的文件,复制以下内容到文件中.

转: 当spring 容器初始化完成后执行某个方法

- - 企业架构 - ITeye博客
转自: http://www.cnblogs.com/rollenholt/p/3612440.html. 在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查. 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出哪个文件的xml文件使用了这个函数.

Spring详解

- - CSDN博客架构设计推荐文章
Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目的是简化企业开发.. PersonDaoBean 是在应用内部创建及维护的. 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.

Spring定时

- - 行业应用 - ITeye博客
spring的定时任务配置分为三个步骤:. . . . . .

简单Spring+hessian

- - Web前端 - ITeye博客
简单的Spring+hessian. dist\modules里面的 spring-webmvc.jar . lib\caucho 里面的hessian-3.1.3.jar. 里面有个接口interface:. 建立一个model层:(实现Serializable接口). 在WEB-INF下面创建一个remoting-servlet.xml:.

Spring MVC 和 Struts2

- - CSDN博客架构设计推荐文章
Web层面的框架学习了三个Struts1和2,SpringMVC,那他们之间肯定存在一个优劣和适用的环境,Struts1和2的异同点我已经做过对比《 Struts1和Struts2》,这篇将对比下Struts2和SpringMVC的异同,下面数据基本来源于网络,本人是搜集整理所得,供大家参考. 一个项目使用什么样的技术,决定的因素很多,我所能想到的有:对系统的性能、开发的效率、团队学习的成本、业务场景等,下面尽量从这几个方面入手,来分析比较下他们之间存在的优劣.

Spring AOP详解

- - Java - 编程语言 - ITeye博客
        最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP来解决. 一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容. 例如,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 1.对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况.

spring roo 入门

- - 企业架构 - ITeye博客
Spring官网下载STS(如果没有STS). 创建Spring Roo基础项目. 根 据ROO的提示输入jpa setup再按ctrl+space,很遗憾这个快捷键已经被输入法切换占用,不能借助提示输入命令,但我们可以打开ROO命令向导,这里我们输入jpa 可以查到这条命令的用法,根据提示增加provider和database选项来完成命令.

Spring Rmi配置

- - 企业架构 - ITeye博客
现在远程调用一般用RPC,webservice或者Rmi,而目前用的比较多的是webservice和Rmi. webservice和rmi的最主要的区别,rmi的客户端和服务端都必须是java,webservice没有这个限制,webservice是在http协议上传递xml文本文件. 与语言和平台无关,rmi是在tcp协议上传递可序列化的java对象,只能用在java虚拟机上,绑定语言.