`

在servlet中注入spring容器中的bean(转)

 
阅读更多
在servlet中注入spring容器中的bean
在使用spring容器的web应用中,业务对象间的依赖关系都可以用context.xml文件来配置,并且由spring容器来负责依赖对象 的创建。如果要在servlet中使用spring容器管理业务对象,通常需要使用WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext())来获得WebApplicationContext,然后调用WebApplicationContext.getBean("beanName")来获得对象的引用,这实际上是使用了依赖查找来获得对象,并且在servlet代码中硬编码了应用对象的bean名字。为了能在servlet中感知spring中bean,可采用如下步骤来实现:

1- 将servlet作为bean定义在context.xml文件中,和要应用的bean定义放在一起;

2- 实现一个代理servlet,该servlet用WebApplicationContext来获得在context.xml中定义的servlet的对象,并将任务委托给context.xml中定义的servlet

3- 在web.xml中用ContextLoaderListener来初始化spring 的context,同时在代理servlet的定义中用初始化参数来定义context.xml中servlet的bean名字。

4- 在web.xml中定义代理servlet的mapping.

利用这种方式就将servlet和业务对象的依赖关系用spring 来进行管理,并且不用在servlet中硬编码要引用的对象名字。

例子代码如下:

(1)代理servlet:

=======================================================================

package chen;

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 ServletToBeanProxy extends GenericServlet {

private String targetBean;

private Servlet proxy;


public void init() throws ServletException {
System.out.println("proxy init");
    this.targetBean = getInitParameter("targetBean");
    getServletBean();
    proxy.init(getServletConfig());
}


public void service(ServletRequest req, ServletResponse res)
   throws ServletException, IOException {

proxy.service(req, res);

}


private void getServletBean() {

WebApplicationContext wac =
   WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
this.proxy = (Servlet)wac.getBean(targetBean);

}


}


=================================================================================

(2)web.xml中配置

<context-param>
<param-name>contextConfigLoaction</param-name>
<param-value>/WEB-INF/context.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>ProxyBean</servlet-name>
<servlet-class>chen.ServletToBeanProxy</servlet-class>
<init-param>
   <param-name>targetBean</param-name>
   <param-value>servletBean</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>ProxyBean</servlet-name>
<url-pattern>/ProxyBean</url-pattern>
</servlet-mapping>

(3) 完成实际任务的servlet定义,该servlet会引用另一个Book的对象

======================= ServletBean.java=======================

package chen;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
* Servlet implementation class for Servlet: ServletBean
*
*/
public class ServletBean extends javax.servlet.GenericServlet implements javax.servlet.Servlet {

private Book book;



public ServletBean() {
super();
} 




public void init() throws ServletException {

super.init();

}


public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
book.showInfo();

}

public Book getBook() {
return book;
}

public void setBook(Book book) {
this.book = book;
}   
}

================================Book.java==============================

package chen;


public class Book {
private String isbn;
private String name;



public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}


public void showInfo() {
System.out.println("book info...");
}


}


(4) context.xml配置

<beans>
<bean id="book" class="chen.Book"/>
<bean id="servletBean" class="chen.ServletBean">
<property name="book">
   <ref bean="book"/>
</property>
</bean>
</beans>
注意,在web.xml中并不出现ServletBean的说明,取而代之的是ServletToBeanProxy的说明,并用初始化参数targetBean来定义要代理的Servlet在context.xml中的名字。

当在浏览器中输入http://localhost/webcontext/ProxyBean时 ,spring将会创建ServletBean一个实例,其引用的Book实例也会被创建。

对Filter,springframework1.2以后自带了org.springframework.web.filter.DelegatingFilterProxy 来实现Filter和业务对象之间的代理,不需要自行开发了。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/indexchen/archive/2006/09/28/1301717.aspx
分享到:
评论

相关推荐

    在Servlet直接获取Spring框架中的Bean.docx

    总之,在Servlet中直接获取Spring的Bean可以帮助简化代码,减少重复的工作,并利用Spring的依赖注入能力。然而,这种方式应该谨慎使用,因为它可能破坏了依赖注入的初衷,使得代码更难测试和维护。在可能的情况下,...

    spring依赖注入bean

    在 Web 应用中,Spring 通常作为 Servlet 容器的一部分工作,例如 Tomcat 或 Jetty,通过 XML 配置文件或注解来定义 Bean 的配置。然而,在非 Web 的 Java 应用程序,如桌面应用或服务,我们同样可以利用 Spring 的 ...

    servlet与spring整合例子

    只需在`beans.xml`中声明这些对象,然后在Servlet中声明对应的成员变量并使用`@Autowired`注解,Spring容器会在初始化Servlet时自动将对象注入,避免了手动创建对象和管理对象生命周期的繁琐工作。 4. **Spring MVC...

    Web项目中获取SpringBean与在非Spring组件中获取SpringBean.pdf

    这时,我们就需要一种方式来访问Spring的ApplicationContext,它是Spring容器的核心,负责管理所有Bean。 一种常见的做法是创建一个工具类,如`SpringUtil`,该类实现`ApplicationContextAware`接口。这个接口是...

    Java中Spring获取bean方法小结

    - 避免过度使用`getBean()`:频繁使用`getBean()`可能导致代码过于紧密地耦合于Spring容器,降低代码的可读性和可测试性。 总结,Spring框架通过BeanFactory和ApplicationContext提供了灵活的方式来管理和获取Bean...

    JSP 开发之servlet中调用注入spring管理的dao

    在Web开发中,JSP(Java Server Pages)通常与Servlet结合使用...这个工具方法的存在,为在Servlet中注入Spring管理的DAO对象提供了一种可行的路径,从而使得Web应用的数据访问层可以利用Spring框架提供的便利和功能。

    Spring 管理filter 和servlet

    开发者无需在Filter或Servlet内部硬编码bean名称,而是通过Spring容器自动注入所需的依赖,大大提升了代码的整洁度和复用性。此外,Spring提供的Filter和Servlet代理类,进一步简化了集成过程,使开发者可以专注于...

    原生Servlet与Spring Controller性能比较--Servlet项目

    3. **资源利用率**:Spring MVC利用IoC容器管理Bean,可减少内存占用,而原生Servlet可能创建更多的临时对象。 4. **扩展性和可维护性**:Spring MVC提供了更好的模块化和解耦,使得添加新功能、调整逻辑、单元测试...

    详解Spring中bean的作用域

    如果你使用的是 Servlet 2.4 及以上的 web 容器,那么你仅需要在 web 应用的 XML 声明文件 web.xml 中增加下述 ContextListener 即可:&lt;web-app&gt;...&lt;listener&gt;&lt;listener-class&gt;org.springframework.web.context....

    特殊情况(ActionForm,Servlet, Filter, Listener)下Spring如何注入对象

    在Spring框架中,依赖注入(Dependency Injection,DI)是一种核心特性,它允许对象之间的依赖关系在运行时由Spring容器管理,而不是由代码直接创建。在SSH(Struts、Hibernate、Spring)整合的Web应用中,Spring的...

    第一章 Spring4 简介及获取Bean

    4. **setter方法注入**:使用`@Autowired`注解在setter方法上,Spring会在运行时调用setter方法注入Bean。 **Spring框架的组件** Spring框架由多个模块组成,包括: 1. **Core Container**:包括Core和Beans模块...

    JSP 获取spring容器中bean的两种方法总结

    我们经常需要在各种组件中使用Spring容器中定义的bean。特别地,在JSP页面中,有时候也可能会需要获取和使用这些bean。下面将详细介绍在JSP页面中获取Spring容器中bean的两种方法。 ### 方法一:在Web应用中使用 ...

    Spring中依赖注入与容器

    这样,业务逻辑组件无需关心依赖的具体实现,只需声明需要的服务,由Spring容器负责创建和注入。 通过这样的设计,Spring使得开发者可以更加专注于业务逻辑,而不是如何管理和创建依赖,从而提高了开发效率和代码...

    web.xml文件中配置(servlet, spring, filter, listenr)的加载顺序

    在`web.xml`中配置Spring时,通常通过Listener来加载Spring容器,这样可以在应用程序启动时初始化所有的Spring Bean。 **示例代码:** ```xml org.springframework.web.context.ContextLoaderListener ...

    Spring和SpringMVC父子容器关系

    这意味着,我们可以方便地在SpringMVC的Controller中注入服务层的bean,无需关心它们是在哪个容器中定义的。 总结来说,Spring和SpringMVC的父子容器关系使得我们能够清晰地划分应用的各个组件,提供了一种灵活的...

    Spring3.1.3 Ioc在Web容器中的建立

    标题 "Spring3.1.3 Ioc在Web容器中的建立" 涉及...这个过程涉及到Spring容器的初始化、bean的定义与依赖注入,以及Web应用的结构配置。通过理解和熟练运用这些知识,开发者可以更好地构建可维护、可扩展的Spring应用。

    spring管理servlet的利器--SimpleServletHandlerAdapter

    在Spring的配置文件中,你需要定义一个`Servlet`实例,然后将其作为一个bean注册到Spring容器中。接着,你需要创建一个`SimpleServletHandlerAdapter`的bean,并通过`handler`属性指定刚刚注册的Servlet。这样,...

    Servlet+JSP和Spring+MVC初学指南 书籍配套源码

    1. Spring容器:理解Bean的定义、依赖注入以及自动扫描。 2. Controller:创建Controller类,处理HTTP请求,并通过ModelAndView返回响应。 3. 视图解析:配置视图解析器,如InternalResourceViewResolver,将逻辑...

    Spring在容器在启动的时候发生了什么

    在Spring框架中,当一个基于Servlet的Web应用启动时,Spring容器的初始化过程是至关重要的。这个过程涉及到多个组件和步骤,让我们详细探讨一下。 首先,我们在`web.xml`配置文件中看到了`&lt;context-param&gt;`和`...

    Spring.html

    Spring IOC 控制反转:把创建对象的权利交给Spring 创建对象 1.无参构造&lt;bean class=""&gt; ... 2....在Servlet中使用WebApplicationContextUtils获取容器对象 5.使用容器对象去获取Service对象

Global site tag (gtag.js) - Google Analytics