Spring – вставка зависимости в ServletContextListener
Я хотел бы добавить зависимость в ServletContextListener
. Однако мой подход не работает. Я вижу, что Spring вызывает мой метод setter, но позже, когда contextInitialized
, свойство равно null
.
Вот моя настройка:
ServletContextListener:
- Приложение Spring Boot как услуга
- время ожидания запуска службы Windows
- Как запустить приложение при запуске?
- Как открыть командную строку и вставить команды с помощью Java?
- Окончательный способ запуска событий нажатия клавиш с помощью jQuery
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
Каков правильный способ достичь этого?
- java.lang.NoClassDefFoundError: org / apache / juli / logging / LogFactory
- Запуск пакетного файла при запуске
- Есть ли способ запустить метод / class только при запуске Tomcat / Wildfly / Glassfish?
- PowerShell - Коммутаторы Start-Process и Cmdline
- Android: запуск активности из интерактивного текста
- Android singleTask или singleInstance запускают режим?
- Android реагирует на URL в намерении
Ответ собаки (принятый) работает, но это затрудняет тестирование из-за того, как создаются объекты. Я предпочитаю подход, предложенный в этом вопросе :
@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, вы не можете достичь того, что вы пытаетесь, в чем причина, по которой вы хотите установить переменные экземпляра в слушателе?