2012-02-03 18 views
0

春の依存性注入

<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はnullです。 私はsetUserDaoメソッドの中にブレークポイントを置き、もう1つはdoGetメソッドの中にブレークポイントを置き、それが同じinsatnceではないことがわかりました...どうしてですか?どうすれば修正できますか?感謝! ありがとう!

+0

豆をサーブレットに注入する方法を示すコードを投稿してください。 –

+0

また、あなたの 'doGet'メソッド本体を投稿してください。 –

+1

あなたは' new MyServiceT() 'をどこかで呼び出すのではないでしょうか? –

答えて

2

Springが正しくBeanを起動している場合、サーブレットコンテナがSpringとは独立してサーブレットをインスタンス化するという問題があります。ですから、基本的には2つの異なるインスタンスがあります.1つは春で作成され、もう1つはコンテナで作成されます。サーブレットでは、その後、

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

と::

回避策の一つは、あなたのアプリ-のcontext.xmlに以下を置くことによって、ServletContextAttributeExporterを使用することです

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を使用してそれは必要なすべてのものをautowire。

this blog postも参照してください。サーブレットをHttpRequestHandlerに変換して、​​(両方とも春)で提供する方が簡単かもしれません。

+0

ありがとうございます! – user1116377