通过声明
<listener>
<listener-class>com.web.Utils.InitApp</listener-class>
</listener>
在你的 web.xml 中,你告诉你的容器初始化并注册一个InitApp
. 因此,该对象不由 Spring 管理,您无法@Autowired
对其进行任何操作。
如果您的应用程序上下文设置为对com.web.Utils
包进行组件扫描,那么您将拥有一个InitApp
未在容器中注册为侦听器的 bean。因此,即使您的其他 bean 将是@Autowired
,servlet 容器也不会命中它。
这就是权衡。
如果您对 servlet 3.0使用带有 aServletContainerInitializer
或 a的编程配置,则有一些解决方法。WebApplicationInitializer
您不会使用@Autowired
,您只会拥有用于设置实例的 setter/getter。
这是一个例子
class SpringExample implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
WebApplicationContext context = ...;
SomeBean someBean = context.getBean(SomeBean.class);
CustomListener listener = new CustomListener();
listener.setSomeBean(someBean);
// register the listener instance
servletContext.addListener(listener);
// then register DispatcherServlet and ContextLoaderListener, as appropriate
...
}
}
class CustomListener implements ServletContextListener {
private SomeBean someBean;
public SomeBean getSomeBean() {
return someBean;
}
public void setSomeBean(SomeBean someBean) {
this.someBean = someBean;
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// do something with someBean
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
请注意,Spring 有一些WebApplicationInitializer
非常复杂的自定义实现。您真的不需要自己直接实现它。这个想法保持不变,只是在继承层次结构中更深。