使 ServletContextListener spring 感知

2022-09-02 01:46:27

我正在Spring中插入现有的Java EE Web应用程序。我在网上有以下几行.xml:

<listener>
    <listener-class>com.MyContextListener</listener-class>
</listener> 

下课呢?MyContextListener

public class MyContextListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent event) {
       //...
    }
}

我应该做些什么才能由Spring管理?MyContextListener


编辑:

我的假设是:Spring应该创建所有的servlet和所有的Web应用程序基础设施,所以所有发生的方法都应该由Spring以某种方式处理。我怎么能实现,通过实现一些接口,我想。如果我错了,请纠正我。谢谢!contextInitializedMyContextListener


答案 1

我们有一个类似的场景,将现有的泽西岛 Web 服务应用配置为使用 Spring 进行依赖关系注入。我们的泽西岛网络应用程序扩展了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;

我们将泽西-弹簧桥与所有弹簧依赖关系(包括 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>

其次是 servlet 及其 init-param 值和 servlet 映射。您显然可以采用注释配置来代替 xml confib,在这种情况下,您需要使用 WebListener 注释。

我们使用各种注释,例如

@Component for objects
@Service for services 
@Repository for DAOs
@Controller for controllers/resources 
@ContextConfiguration for tests

一切都由Spring框架加载和自动连接


答案 2

我应该做些什么才能由Spring管理?MyContextListener

这取决于您使用的配置方式。无论如何,你应该直接告诉Spring使用你声明的类。这可以通过以下方式完成:

@WebListener
public class MyContextListener implements ServletContextListener { ... }

标有此注释的类(Servlet 3.0 规范,8.1.4)必须实现这些接口之一

HttpSessionAttributeListener
HttpSessionListener
ServletContextAttributeListener
ServletContextListener (+)
ServletRequestAttributeListener
ServletRequestListener
HttpSessionIdListener

它实际上确实如此。

就个人而言,我更喜欢基于元注释的方法,这使我的配置更短,更简洁。

Spring应该创建所有的servlet和所有的Web应用程序基础设施,所以所有发生的方法都应该由Spring以某种方式处理。contextInitializedMyContextListener

是的,如果您提供一些可以帮助它注册/配置/创建/管理实例的信息,Spring将为您完成此操作。

这些信息可以是元信息(一个告诉如何创建实例的模板,如s)或一个完整的实例本身(通常,它以编程方式传递,反过来,导致编写大量代码)。BeanDefinition

我怎么能实现,通过实现一些接口,我想。

您正在实现一个接口,以使侦听器成为侦听器(描述将在某些时间点调用的特定方法的类)。Spring本身负责在这些时间点保证此类调用,在现有Web基础架构中放置一个对象。


推荐