有时在Spring(3.2.5)项目中,如果使用到Servlet,可能希望Servlet实例作为bean受Spring容器管理,这样也能自动注入其他需要的bean,查了下,发现只针对过滤器提供了代理类org.springframework.web.filter.DelegatingFilterProxy,并没有提供针对Servlet的代理类,于是模仿着写了下面的代理类:
package org.springframework.web.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.util.Assert;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
/**
* Servlet代理类,将Servlet托管于Spring容器,以便直接在Servlet内部自动注入其他bean<br>
* 参考 {@code org.springframework.web.filter.DelegatingFilterProxy}<br>
*/
@SuppressWarnings("serial")
public class DelegatingServletProxy extends HttpServletBean {
private String contextAttribute;
private WebApplicationContext webApplicationContext;
private String targetBeanName;
private boolean targetServletLifecycle = true;
private volatile Servlet delegate;
private final Object delegateMonitor = new Object();
public DelegatingServletProxy() {
}
public DelegatingServletProxy(Servlet delegate) {
Assert.notNull(delegate, "delegate Servlet object must not be null");
this.delegate = delegate;
}
public DelegatingServletProxy(String targetBeanName) {
this(targetBeanName, null);
}
public DelegatingServletProxy(String targetBeanName, WebApplicationContext wac) {
Assert.hasText(targetBeanName, "target Servlet bean name must not be null or empty");
this.setTargetBeanName(targetBeanName);
this.webApplicationContext = wac;
if (wac != null) {
this.setEnvironment(wac.getEnvironment());
}
}
public void setContextAttribute(String contextAttribute) {
this.contextAttribute = contextAttribute;
}
public String getContextAttribute() {
return this.contextAttribute;
}
public void setTargetBeanName(String targetBeanName) {
this.targetBeanName = targetBeanName;
}
protected String getTargetBeanName() {
return this.targetBeanName;
}
public void setTargetServletLifecycle(boolean targetServletLifecycle) {
this.targetServletLifecycle = targetServletLifecycle;
}
protected boolean isTargetServletLifecycle() {
return this.targetServletLifecycle;
}
@Override
protected void initServletBean() throws ServletException {
synchronized (this.delegateMonitor) {
if (this.delegate == null) {
if (this.targetBeanName == null) {
this.targetBeanName = this.getServletName();
}
WebApplicationContext wac = this.findWebApplicationContext();
if (wac != null) {
this.delegate = this.initDelegate(wac);
}
}
}
}
@Override
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
Servlet delegateToUse = this.delegate;
if (delegateToUse == null) {
synchronized (this.delegateMonitor) {
if (this.delegate == null) {
WebApplicationContext wac = this.findWebApplicationContext();
if (wac == null) {
throw new IllegalStateException("No WebApplicationContext found: no ContextLoaderListener registered?");
}
this.delegate = this.initDelegate(wac);
}
delegateToUse = this.delegate;
}
}
this.invokeDelegate(delegateToUse, req, resp);
}
@Override
public void destroy() {
Servlet delegateToUse = this.delegate;
if (delegateToUse != null) {
this.destroyDelegate(delegateToUse);
}
}
protected WebApplicationContext findWebApplicationContext() {
if (this.webApplicationContext != null) {
if (this.webApplicationContext instanceof ConfigurableApplicationContext) {
if (!((ConfigurableApplicationContext) this.webApplicationContext).isActive()) {
((ConfigurableApplicationContext) this.webApplicationContext).refresh();
}
}
return this.webApplicationContext;
}
String attrName = this.getContextAttribute();
if (attrName != null) {
return WebApplicationContextUtils.getWebApplicationContext(super.getServletContext(), attrName);
}
else {
return WebApplicationContextUtils.getWebApplicationContext(super.getServletContext());
}
}
protected Servlet initDelegate(WebApplicationContext wac) throws ServletException {
Servlet delegate = wac.getBean(this.getTargetBeanName(), Servlet.class);
if (this.isTargetServletLifecycle()) {
delegate.init(super.getServletConfig());
}
return delegate;
}
protected void invokeDelegate(Servlet delegate, ServletRequest req, ServletResponse resp) throws ServletException, IOException {
delegate.service(req, resp);
}
protected void destroyDelegate(Servlet delegate) {
if (this.isTargetServletLifecycle()) {
delegate.destroy();
}
}
}
//======================================================//
用法:
1、比如存在test.TestServlet,配置到spring对应xml中:
<bean id="testServlet" class="test.TestServlet" />
2、在web.xml配置如下:
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DelegatingServletProxy</servlet-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>testServlet</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
然后在TestServlet中可自动注入需要的bean。
- 浏览: 18661 次
- 性别:
- 来自: 海口
相关推荐
而在整合Spring后,我们可以使用Spring提供的`HttpServletBean`或者`FrameworkServlet`(例如`DispatcherServlet`)作为Servlet的基础类,这样Servlet实例就会自动由Spring容器管理。`DispatcherServlet`是Spring ...
1. **初始化性能**:Servlet需要在服务器启动时加载并初始化,而Spring MVC通过Spring容器管理Controller实例,一般使用懒加载,因此在应用启动时,Spring Controller的性能可能优于Servlet。 2. **请求处理速度**...
开发者无需在Filter或Servlet内部硬编码bean名称,而是通过Spring容器自动注入所需的依赖,大大提升了代码的整洁度和复用性。此外,Spring提供的Filter和Servlet代理类,进一步简化了集成过程,使开发者可以专注于...
【标题】"基于Servlet+Spring+Mybatis的客户关系管理系统.zip"揭示了这是一个采用Java Web...深入研究这些代码可以帮助我们理解系统的具体实现方式,学习如何整合Servlet、Spring和Mybatis来构建一个完整的Web应用。
一旦Spring容器被启动,它会创建一个`WebApplicationContext`对象,并将其绑定到Servlet上下文(ServletContext)。应用程序中的组件可以通过`WebApplicationContextUtils`工具类获取到`ApplicationContext`实例: ...
整合 CXF 和 Spring 的主要好处在于,可以利用 Spring 的容器管理 CXF 组件,简化配置,同时利用 Spring 的事务管理、安全控制等特性,提升整个应用的可维护性和扩展性。 以下是 CXF 整合 Spring 的基本步骤: 1. ...
Spring 框架的主要模块包括 Core Container、AOP、Web、Web-Servlet、Web-Struts 和 JDBC 等。 二、 Java-Spring 整合的优点 使用 Java-Spring 整合可以带来很多优点,例如: * 简化开发:Spring 框架提供了一个...
Spring在SSH中作为核心容器,管理其他组件的生命周期和依赖关系,关键的jar包包括: - `spring-beans.jar`:包含Bean工厂和依赖注入功能。 - `spring-context.jar`:提供上下文支持,包括AOP、事件、国际化等。 - `...
首先,Spring框架是整个系统的基础,它提供了一个容器来管理对象的生命周期和依赖关系。通过XML配置文件或注解方式,可以实现对象的自动装配。Spring的AOP功能允许我们定义切面,实现如日志记录、事务管理等功能,使...
最后,应用的启动入口通常是一个Servlet或Filter,例如Spring的ContextLoaderListener或DelegatingFilterProxy,它们负责初始化Spring容器,并在Web应用启动时加载配置。 总结起来,整合Spring、SpringMVC和MyBatis...
这涉及到`spring-mvc` jar包,同时还需要`servlet-api.jar`和`jsp-api.jar`来支持Servlet和JSP运行。 3. **Mybatis配置**:Mybatis的jar包包括`mybatis.jar`和`mybatis-spring.jar`,前者包含Mybatis的主要功能,后...
Struts和Spring之间通过ActionServlet和Spring的DispatcherServlet协同工作,而Spring与Hibernate之间的整合通常通过SessionFactoryBean和HibernateTemplate完成。 8. **用户注册流程**:用户提交注册信息后,...
Spring框架作为全能型的IoC(Inversion of Control)/DI(Dependency Injection)容器,负责管理和装配应用中的各种组件。Spring还提供了AOP(面向切面编程)支持,用于实现如日志、事务管理等跨切面关注点。在...
例如,Spring MVC中的DispatcherServlet就是由Spring容器管理的。 2. Spring MVC: Spring MVC 是Spring框架的一部分,专门用于处理Web请求。它遵循模型-视图-控制器(MVC)设计模式,负责接收请求、处理业务逻辑、...
它包括了WebApplicationContext,这是Web应用特有的上下文,提供了与Servlet容器交互的能力。另外,Spring4.3.7还支持国际化(i18n)、主题(theme)和静态资源处理等功能。 在Spring4.3.7的Web整合包中,还包括了...
SSM(Spring、SpringMVC、MyBatis)是一个经典的Java web开发框架组合,它将Spring作为核心容器,SpringMVC作为控制层,MyBatis作为数据访问层,提供了高效且灵活的Java web应用程序开发解决方案。这个“mybatis与...
### SSH整合Struts Hibernate Spring详解 #### 一、概述 SSH框架是指由Struts、Hibernate和Spring三个开源框架组成的轻量级Java企业级应用开发框架。这三个框架在Java Web开发中各自扮演着重要的角色:Struts负责...
这些配置用于初始化Spring容器并管理各个组件。 3. **配置SpringMVC**:创建SpringMVC的配置文件(如`servlet-context.xml`),配置DispatcherServlet、ViewResolver、HandlerMapping等,定义MVC的行为和视图解析...
这些bean是Spring管理的对象,它们的生命周期由Spring容器控制。例如,我们可以在这里声明数据库连接池、数据源、事务管理器等。 2. **配置Web Dispatcher Servlet**:在`web.xml`中,我们需要配置一个Spring的...