【问题标题】:Spring dependency injection to other instanceSpring依赖注入到其他实例
【发布时间】:2012-02-26 00:30:24
【问题描述】:

来自 app-context.xml:

 <bean id="userDao" class="com.vaannila.dao.UserDAOImpl">
    <property name="sessionFactory" ref="mySessionFactory"/>
</bean>  

<bean name="MyServiceT" class="com.s.server.ServiceT">
    <property name="userDao" ref="userDao"/>
</bean> 

在ServiceT.java内部:

private UserDAO userDao;

public void setUserDao(UserDAO userDao){
    this.userDao = userDao;
}

问题是:setUserDao 在服务器启动时被调用,但当我调用我的 doGet 方法时:

    protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    PrintWriter writer = response.getWriter();

    writer.write("hello");
    }

userDao 为空。 我在 setUserDao 方法中放置了一个断点,在 doGet 方法中放置了另一个断点,发现它不一样……原因是什么?我该如何解决? 谢谢!

【问题讨论】:

  • 请发布代码,说明如何将 bean 注入 servlet。
  • 同时发布您的doGet 方法体
  • 你不会在某个地方给new MyServiceT()打电话吧?
  • 它是由应用程序上下文注入的(参见上面的“MyServiceT”bean)。我不必调用 new MyServiceT() 因为它是一个 servlet。只需使用浏览器调用 doGet (27.0.0.1:8888/MyServicT)

标签: spring servlets dependency-injection


【解决方案1】:

Spring 正在正确装配您的 bean,问题是 servlet 容器独立于 spring 实例化您的 servlet。所以你基本上有两个不同的实例 - 一个由 spring 创建,另一个由容器创建。

一种解决方法是使用ServletContextAttributeExporter,将以下内容放入您的app-context.xml:

<bean class="org.springframework.web.context.support.ServletContextAttributeExporter">
 <property name="attributes">
     <map>
         <entry key="userDao">
             <ref bean="userDao"/>
         </entry>
      </map>
</property>

然后,在您的 servlet 中:

protected void doGet(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {

    UserDao userDao = (UserDao)getServletContext().getAttribute("userDao");

    // do something with userDao

    PrintWriter writer = response.getWriter();

    writer.write("hello");
}

另一种是直接访问WebApplicationContext

protected void doGet(HttpServletRequest reqest, HttpServletResponse response)
                                     throws ServletException, IOException {

    WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
    UserDao userDao =(UserDao)springContext.getBean("userDao");

 }

...或者简单地使用 Spring MVC 并让它自动装配所有东西。

另见this blog post。将您的 servlet 转换为 HttpRequestHandler 并让它由 HttpRequestHandlerServlet 提供服务可能会更容易,两者都由 spring 提供。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2019-06-24
    • 2016-10-23
    相关资源
    最近更新 更多