Подтвердить что ты не робот

Сделать 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. Как я могу достичь, реализуя некоторый интерфейс, я полагаю. Поправьте меня, если я ошибаюсь. Благодарю!

4b9b3361

Ответ 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.