Spring - внедрение зависимости в ServletContextListener - PullRequest
26 голосов
/ 20 января 2011

Я хотел бы добавить зависимость в ServletContextListener. Однако мой подход не работает. Я вижу, что Spring вызывает мой метод установки, но позже, когда вызывается contextInitialized, свойство равно null.

Вот мои настройки:

ServletContextListener:

public class MyListener implements ServletContextListener{

    private String prop;

    /* (non-Javadoc)
     * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
     */
    @Override
    public void contextInitialized(ServletContextEvent event) {
        System.out.println("Initialising listener...");
        System.out.println(prop);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
    }

    public void setProp(String val) {
        System.out.println("set prop to " + prop);
        prop = val;
    }
}

web.xml: (это последний прослушиватель в файле)

<listener>
  <listener-class>MyListener</listener-class>
</listener> 

applicationContext.xml:

<bean id="listener" class="MyListener">
  <property name="prop" value="HELLO" />
</bean>  

Выход:

set prop to HELLO
Initialising listener...
null

Как правильно достичь этого?

Ответы [ 4 ]

30 голосов
/ 29 июня 2012

Ответ (принятый) на собачьей бочке работает, но затрудняет тестирование из-за того, как создаются экземпляры бобов. Я предпочитаю подход, предложенный в этом вопросе :

@Autowired private Properties props;

@Override
public void contextInitialized(ServletContextEvent sce) {
    WebApplicationContextUtils
        .getRequiredWebApplicationContext(sce.getServletContext())
        .getAutowireCapableBeanFactory()
        .autowireBean(this);

    //Do something with props
    ...
}    
17 голосов
/ 21 января 2011

Я решил эту проблему, удалив компонент-слушатель и создав новый компонент для моих свойств. Затем я использовал следующее в моем слушателе, чтобы получить bean-компонент свойств:

@Override
public void contextInitialized(ServletContextEvent event) {

    final WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
    final Properties props = (Properties)springContext.getBean("myProps");
}
5 голосов
/ 20 января 2011

Как упоминалось ранее, ServletContextListener создается сервером, поэтому Spring не управляет им.

Если вы хотите получать уведомления о ServletContext, вы можете реализовать интерфейс:

org.springframework.web.context.ServletContextAware
1 голос
/ 20 января 2011

У вас не может быть пружины, чтобы сделать это, как уже было сказано, что создано сервером. Если вам нужно передать params вашему слушателю, вы можете определить его в своем веб-xml как context-param

<context-param> 
        <param-name>parameterName</param-name>
        <param-value>parameterValue</param-value>
    </context-param>

А в Слушателе вы можете получить его, как показано ниже;

 event.getServletContext().getInitParameter("parameterName")

Редактировать 1:

См. Ссылку ниже для другого возможного решения:

Как внедрить зависимости в HttpSessionListener, используя Spring?

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