:
<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方法中放了另一个断点,看到它不是同一个故障......原因是什么?我该怎么解决? 谢谢!
答案 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提供。