gpt4 book ai didi

java - ServletContextListener 中的@Autowired

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:43:41 25 4
gpt4 key购买 nike

我有一个 InitApp 类

@Component
public class InitApp implements ServletContextListener {

@Autowired
ConfigrationService weatherConfService;

/** Creates a new instance of InitApp */
public InitApp() {
}

public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println(weatherConfService);
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}

和 web.xml 中的监听器:

    <listener>
<listener-class>com.web.Utils.InitApp</listener-class>
</listener>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

confService 打印 --> null什么问题?

最佳答案

当我遇到同样的问题时,我想到了一些想法。

第一个是使用 Spring 实用程序从监听器中的 Spring 上下文检索 bean:

例如:

@WebListener
public class CacheInitializationListener implements ServletContextListener {

/**
* Initialize the Cache Manager once the application has started
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
CacheManager cacheManager = WebApplicationContextUtils.getRequiredWebApplicationContext(
sce.getServletContext()).getBean(CacheManager.class);
try {
cacheManager.init();
} catch (Exception e) {
// rethrow as a runtime exception
throw new IllegalStateException(e);
}
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub

}
}

如果您只有一个或两个 bean,这会很好用。否则它会变得乏味。另一种选择是显式调用 Spring 的 Autowire 实用程序:

@WebListener
public class CacheInitializationListener implements ServletContextListener {

@Autowired
private CacheManager cacheManager;

/**
* Initialize the Cache once the application has started
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
try {
cacheManager.init();
} catch (Exception e) {
// rethrow as a runtime exception
throw new IllegalStateException(e);
}
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub

}
}

这两种解决方案的警告是,必须先加载 Spring 上下文,然后才能工作。鉴于无法使用 @WebListener 定义 Listener 顺序,请确保在 web.xml 中定义 Spring ContextLoaderListener 以强制执行它首先加载(网络描述符中定义的监听器在注释定义的监听器之前加载)。

关于java - ServletContextListener 中的@Autowired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17656046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com