Внедрение зависимости Spring в другой экземпляр - PullRequest
1 голос
/ 03 февраля 2012

из 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 и увидел, что это не то же самое ... что является причиной? как я могу это исправить? Спасибо!

1 Ответ

3 голосов
/ 03 февраля 2012

Spring правильно подключает ваш бин, проблема в том, что контейнер сервлета создает ваш сервлет независимо от пружины.Таким образом, у вас в основном есть два разных экземпляра - один создан 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>

и затем в вашем сервлете:

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 все как надо.

Также смотрите этот пост .Возможно, будет проще преобразовать ваш сервлет в HttpRequestHandler и позволить ему обслуживаться HttpRequestHandlerServlet, оба предоставлены spring.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...