Spring依赖注入到其他实例

时间:2012-02-03 11:18:01

标签: spring servlets dependency-injection

来自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;
}

问题是:当服务器继续但我调用我的doGet方法时调用setUserDao:

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

    PrintWriter writer = response.getWriter();

    writer.write("hello");
    }

userDao为null。 我在setUserDao方法中放了一个断点,而在doGet方法中放了另一个断点,看到它不是同一个故障......原因是什么?我该怎么解决? 谢谢!

1 个答案:

答案 0 :(得分:3)

Spring正确地为你的bean提供服务,问题是servlet容器独立于spring实例化你的servlet。所以你基本上有两个不同的实例 - 一个是由spring创建的,另一个是由container创建的。

一种解决方法是使用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提供。