Сделать ServletContextListener spring осведомленным
Я подключаю Spring к существующему веб-приложению Java EE. У меня есть следующие строки в моем web.xml:
<listener>
<listener-class>com.MyContextListener</listener-class>
</listener>
И Следуя MyContextListener
class?
public class MyContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
//...
}
}
Что делать, чтобы сделать MyContextListener
управляемым Spring?
Отредактировано:
Мое предположение: Spring должно создавать все сервлеты и всю инфраструктуру веб-приложений, поэтому все, что произошло в contextInitialized
методе MyContextListener
, должно быть каким-то образом обработано Spring. Как я могу достичь, реализуя некоторый интерфейс, я полагаю. Поправьте меня, если я ошибаюсь. Благодарю!
Ответы
Ответ 1
Ну,
У нас был аналогичный сценарий настройки выходящего приложения Джерси для использования служб Spring для инъекции зависимостей. Наш Джерси webapp расширил ContextLoaderListener, следуя
public class XServletContextListener extends ContextLoaderListener {
...
@Override
public void contextInitialized(ServletContextEvent arg0) {
super.contextInitialized(arg0);
....
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
super.contextDestroyed(arg0);
....
}
}
где ContextLoaderListener
import org.springframework.web.context.ContextLoaderListener;
Мы включили мост jersey- spring со всеми зависимостями Spring, включая applicationContext.xml, как следует
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="com.xxx.*" />
....
....
</beans>
И, очевидно, необходимо убедиться, что XServletContextListener включен в web.xml, как следует
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>com.xxx.**.XServletContextListener</listener-class>
</listener>
Далее следуют сервлет и его значения init-param и отображение сервлета. Очевидно, вы можете использовать конфигурацию аннотаций вместо xml confib, и в этом случае вам нужно будет использовать аннотацию WebListener.
Мы используем множество аннотаций, таких как
@Component for objects
@Service for services
@Repository for DAOs
@Controller for controllers/resources
@ContextConfiguration for tests
Все загружено и автоматически Spring.
Ответ 2
Что делать, если MyContextListener
управляется Spring?
Это зависит от того, какую конфигурацию вы используете. В любом случае, вы должны прямо указать Spring для использования объявленного вами класса. Это можно сделать следующим образом:
@WebListener
public class MyContextListener implements ServletContextListener { ... }
Класс, помеченный этой аннотацией (спецификация Servlet 3.0, 8.1.4) должен реализовать один из этих интерфейсов
HttpSessionAttributeListener
HttpSessionListener
ServletContextAttributeListener
ServletContextListener (+)
ServletRequestAttributeListener
ServletRequestListener
HttpSessionIdListener
что он действительно делает.
Лично я предпочитаю подход, основанный на мета-аннотации, который делает мою конфигурацию короче и более кратким.
Spring должен создавать все сервлеты и всю инфраструктуру веб-приложений, поэтому все, что произошло в contextInitialized
методе MyContextListener
, должно быть каким-то образом обработано Spring.
Да, Spring сделает это для вас, если вы предоставите некоторую информацию, которая может помочь ему зарегистрировать/настроить/создать/управлять экземпляром.
Информация может быть либо метаинформацией (шаблон, который рассказывает, как создать экземпляр, например BeanDefinition
s), так и сам завершенный экземпляр (обычно он передается программно, что, в свою очередь, приводит к написанию огромного количество кода).
Как я могу достичь, реализуя некоторый интерфейс, я полагаю.
Вы реализуете интерфейс, чтобы сделать ваш слушатель слушателем (класс, который описывает конкретные методы, которые будут вызываться в определенные моменты времени). Spring, сам, отвечает за обеспечение таких вызовов в эти моменты времени, размещая объект в существующей веб-инфраструктуре раньше.
Ответ 3
Либо комментируйте класс с помощью @WebListener или с помощью метода @Bean
Ответ 4
Аннотировать, где вы создаете новый экземпляр MyContextListener с помощью @Bean
, если используете Java Configs с Spring Boot.