繁体   English   中英

spring 依赖注入在用 @WebListener 注释的类中不起作用

[英]spring dependency injection is not working in a class annotated with @WebListener

我在实现 ServletContextListener 的 TestAppListener 类中尝试了基于构造函数的依赖注入。 我收到此错误异常发送上下文初始化事件到类 [com.example.listener.TestAppListener] 的侦听器实例

我搜索了堆栈溢出,但找不到针对这种情况的任何解决方案。 请任何人帮我解决这个问题。 我也在 META-INF.services 文件夹中放置了实现类。 我的理解是构造函数依赖注入存在一些问题,但是我的情况需要这种 DI 方式,因为我想实时在启动方法中创建数据源连接。

在下面找到我正在使用的所有课程,

@WebListener
public class TestAppListener implements ServletContextListener {

private static TestDao dao;

public TestAppListener(TestDao dao){
    this.dao = dao;
}
public TestAppListener(){}

@Override
public void contextInitialized(ServletContextEvent sce) {
    dao = ServiceLoader.load(TestDao.class).iterator().next();
    dao.startUp();
    System.out.println("Context initialized method called");
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("Context destroyed method called");
    dao.shutDown();
}

}

public interface TestDao {

void startUp();

void shutDown(); 

}

public class TestDaoImpl implements TestDao {
@Override
public void startUp() {
    System.out.println("Database is initialized");
}

@Override
public void shutDown() {
    System.out.println("Database is initialized");
}

}

@Configuration
public class SpringConfig {

public SpringConfig() {
}

@Bean
public ServletListenerRegistrationBean<ServletContextListener> listenerRegistrationBean() {
    ServletListenerRegistrationBean<ServletContextListener> bean = new ServletListenerRegistrationBean<>();
    bean.setListener(new TestAppListener());
    return bean;
}

}

private static TestDao dao更改为private final TestDao dao Spring 不允许将静态用作注入目标。 此外,您的TestDaoImpl类需要是 Spring 配置文件中定义的组件或 bean。

当容器启动时,Servlet @WebListener由 Servlet 容器(tomcat/Jetty)处理。 所以他们对Spring一无所知。

有关更多详细信息,请参阅本期讨论

一种解决方法是将@WebListener替换为 Spring 的@Component ,因此您可以将 Spring bean(将您的 Dao 声明为 spring bean)直接注入侦听器。

顺便说一句,您必须在 Spring Boot 应用程序类上添加@ServletComponentScan才能激活它。

我创建了一个示例项目来演示@WebServlet@WebFilter@WebListener

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM