`
kodak_zhou
  • 浏览: 136649 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

如何使用spring的autowire为servlet注入Bean(转)

阅读更多
在应用中一般普通的JavaPojo都是由Spring来管理的,所以使用autowire注解来进行注入不会产生问题,但是有两个东西是例外的,一个是 Filter,一个是Servlet,这两样东西都是由Servlet容器来维护管理的,所以如果想和其他的Bean一样使用Autowire来注入的 话,是需要做一些额外的功夫的。
对于Filter,Spring提供了DelegatingFilterProxy,所以本文主要讲述Servlet的解决。
1、比较直观但是不大优雅的做法是重写init()方法,在里面使用AutowireCapableBeanFactory来手工告诉Spring:我这个Servlet是需要这样的一个Bean的。具体写法:
public void init(ServletConfig servletConfig) throws ServletException {
    ServletContext servletContext = servletConfig.getServletContext();
    WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
    AutowireCapableBeanFactory autowireCapableBeanFactory = webApplicationContext.getAutowireCapableBeanFactory();
    autowireCapableBeanFactory.configureBean(this, BEAN_NAME);
}
其中,BEAN_NAME就是需要注入的Bean在spring中注册的名字.
这样写的主要问题是就是那个BEAN_NAME,这样写有点主动查找,而不是依赖注入的感觉。

2、创建一个类似于DelegatingFilterProxy那样的代理,通过代理根据配置来找到实际的Servlet,完成业务逻辑功能。
假定我们有一个Servlet名字叫UserServlet,需要注入一个UserManager,伪代码如下:
public class UserServlet extends HttpServlet {
    @Autowired(required = true)
    private UserManager userManager;
}
第一步:
public class DelegatingServletProxy extends GenericServlet {
    private String targetBean;
    private Servlet proxy;

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        proxy.service(req, res);
    }

    @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);
    }
}
第二步:
配置web.xml文件,原来UserServlet的配置大致是这样的:
    <servlet>
        <servlet-name>userServlet</servlet-name>
        <servlet-class>com.sample.UserServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>userServlet</servlet-name>
        <url-pattern>/userServlet</url-pattern>
    </servlet-mapping>
现在修改为
    <servlet>
        <servlet-name>userServlet</servlet-name>
        <servlet-class>com.sample.DelegatingServletProxy</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>userServlet</servlet-name>
        <url-pattern>/userServlet</url-pattern>
    </servlet-mapping>
注意,spring是根据Servlet的名字来查找被代理的Servlet的,所以,首先我们要在UserServlet类前面加上 @Component,来告诉Srping:我也是一个Bean。如果名称和Web.xml里面定义的不一样的话,可以在这里指定Bean的名字,比如: @Component("userServlet")
分享到:
评论

相关推荐

    Spring框架web项目实战全代码分享

    Spring以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)闻名,为Java开发者提供了一个强大而灵活的基础架构。 1. **新建Java Web项目**: 开始项目时,我们首先创建...

    spring配置.txtspring配置.txt

    这里将`autowire`属性设置为`byName`,意味着Spring框架将尝试自动装配与bean名称匹配的其他bean。 ### 小结 通过对给定文件的分析,我们了解了Spring框架中XML配置的基本用法,包括如何配置`...

    spring定义和装配bean详解

    在Spring中,我们可以通过setter方法、构造方法或autowire的方式来装配Bean。 例如,在`Person`类中,我们可以通过setter方法来装配`car`对象: ```java public class Person { private Car car; public void ...

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    Spring API

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    Spring杂谈

    - **字段注入**:通过使用注解@Autowire或者@Autowired来实现,Spring会自动为bean的字段注入相应的依赖。 ### AOP(面向切面编程) Spring AOP模块提供了面向切面编程的实现,允许开发者定义方法拦截器和切点来...

    springwebsocket 中文注释案例

    &lt;bean id="WebSocketConfig" class="org.springframework.web.socket.config.annotation.WebSocketConfigurer" autowire="byType"&gt; &lt;/bean&gt; &lt;bean id="serverEndpointExporter" class="org.springframework.web....

    Spring+MongoDB实现登录注册功能

    在业务逻辑实现中,我们需要使用Spring的Annotation-config来启用注解式配置,使用@ComponentScan来扫描相关的Bean,使用@Autowire来自动注入相关的Bean。然后,我们需要实现登录注册功能的具体业务逻辑,例如用户...

    Struts2+Spring3+MyBatis3完整实例

    网上的东西好大多都不能直接用,自己结合网上资料做了一个Struts2+Spring3+MyBatis3的测试工程,JUnit测试用例和WEB服务。 内涵完整jar包,解压直接可用,包括一个表文件。 Eclipse3.2+Tomcat/5.5+jdk1.5.0_17 - ...

    ssh开源框架日志心得.pdf

    这个策略指示Spring自动根据bean的属性名称查找相同名称的bean来注入。如果在不同的配置文件中设置,会影响Spring容器如何解析和注入bean。例如,如果在所有配置文件中都设置,可能会导致多个bean之间的冲突;如果...

    软通笔试题

    Spring 框架提供了自动装配机制,根据指定的原则(通过&lt;Bean&gt;的 autowire 属性指定)进行 Bean 的自动装配。Spring 本身为 autowire 属性提供了五个选项:no、byName、byType、constructor 和 autodetect。其中,no ...

    SPRING API 2.0.CHM

    ResourceServlet ResourceUtils ResponseTimeMonitor ResponseTimeMonitorImpl ResultSetExtractor ResultSetSupportingSqlParameter ResultSetWrappingSqlRowSet ResultSetWrappingSqlRowSetMetaData ...

    struts2.0+hibernate3.1+spring2.0.doc

    3. **applicationContext.xml**:Spring的核心配置文件,定义了Bean的实例化、依赖注入等。 ```xml &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; ...

    struts1.3.8+spring2.5.6+hibernate3.3框架集成

    2. **Spring管理Struts Action**:通过Spring的Autowire注解或XML配置,使Action由Spring容器管理。 3. **Spring管理Hibernate SessionFactory**:配置数据源、SessionFactory,使用Spring的HibernateTemplate或...

    ssh整合代码(struts2.0+hibernate+spring)

    - **applicationContext.xml**:Spring的核心配置文件,用于管理Bean的生命周期和依赖注入。 - **web.xml**:Web应用的核心配置文件,用于配置Servlet容器的初始化参数、监听器等。 ### 关键配置文件详解 #### ...

    软通动力Java笔试题2011.docx

    Spring 简化了 Bean 的配置,提供了自动装配(autowire)机制,根据指定的原则(通过 &lt;Bean&gt; 的 autowire 属性指定)进行 Bean 的自动装配。Spring 本身为 autowire 属性提供了五个选项:no、byName、byType、...

    Struts2+spring2+hibernate3实例源码-java源码

    - **applicationContext.xml**:Spring的核心配置文件,配置了Bean的声明周期管理和依赖注入。 ```xml &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...

    SpringBoot.docx

    - **@Bean**:标记方法为 Bean 生产者,返回的对象将被添加到 Spring 容器中。 以上是 SpringBoot 学习的一些基础知识点,涵盖项目创建、HTTP 请求处理、文件上传及常用注解的使用。深入学习 SpringBoot 还需理解...

    软通动力Java笔试题2011,大家可要把握好机会哦。

    Spring 简化了 Bean 的配置,提供了自动装配(autowire)机制,根据指定的原则(通过&lt;Bean&gt;的 autowire 属性指定)进行 Bean 的自动装配,Spring 本身为 autowire 属性提供了五个选项:no、byName、byType、...

    软通动力Java笔试题1

    Spring简化了Bean的配置,提供了自动装配(autowire)机制,根据指定的原则(通过&lt;Bean&gt;的autowire属性指定)进行Bean的自动装配,Spring本身为autowire属性提供了byName、byType、constructor、no五个选项。...

Global site tag (gtag.js) - Google Analytics