2012-02-03 105 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