Spring – вставка зависимости в ServletContextListener

Я хотел бы добавить зависимость в ServletContextListener . Однако мой подход не работает. Я вижу, что Spring вызывает мой метод setter, но позже, когда 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: (это последний прослушиватель в файле)

  MyListener  

applicationContext.xml:

    

Вывод:

 set prop to HELLO Initialising listener... null 

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

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

 @Autowired private Properties props; @Override public void contextInitialized(ServletContextEvent sce) { WebApplicationContextUtils .getRequiredWebApplicationContext(sce.getServletContext()) .getAutowireCapableBeanFactory() .autowireBean(this); //Do something with props ... } 

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

 @Override public void contextInitialized(ServletContextEvent event) { final WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()); final Properties props = (Properties)springContext.getBean("myProps"); } 

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

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

 org.springframework.web.context.ServletContextAware 

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

  parameterName parameterValue  

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

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

Изменить 1:

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

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

ServletContextListener создается сервером, а не весной.

EDIT: AFAIK, вы не можете достичь того, что вы пытаетесь, в чем причина, по которой вы хотите установить переменные экземпляра в слушателе?

Давайте будем гением компьютера.