2012-02-03 74 views
0

从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方法内部放置了另一个断点,并且看到它不是同一个insatnce ...原因是什么?我该如何解决它? 谢谢!

+0

请发布显示如何将bean注入servlet的代码。 – 2012-02-03 11:20:05

+0

也发布你的'doGet'方法体 – 2012-02-03 11:22:16

+1

你不是在某处调用'new MyServiceT()',不是吗? – 2012-02-03 11:27:34

回答

2

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并让它由​​提供服务可能会更容易,这两个都是由spring提供的。

+0

非常感谢你! – user1116377 2012-02-03 19:48:50