本文说的通过DispatcherServlet生成WebApplicationContext,并不是说在web.xml不配置ContextLoaderListener,而是指通过DispatcherServlet去加载声明Bean的spring配置文件。如果在web.xml不配置ContextLoaderListener,那么下面这行代码获取到的WebApplicationContext将是null。
WebApplicationContextUtils.getWebApplicationContext(sc);
至于两者生成WebApplicationContext区别与关系,可参考:http://www.iteye.com/topic/1125421。基于自己碰到的情况,本文说一种常见的情况,
即:如果只通过DispatcherServlet生成了WebApplicationContext,而没有通过ContextLoaderListener生成WebApplicationContext,那么,在Filter中获取WebApplicationContext,然后通过上下文获取Bean的时候,结果是:Bean是获取不到的。如下面的代码:
public class JavaScriptLocalizeFilter implements Filter { private JavaScriptLocalizeBean jsLocalizeBean; @Override public void init(FilterConfig config) throws ServletException { ServletContext sc = config.getServletContext(); WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(sc); //下面的代码 是获取不到bean的 jsLocalizeBean = context.getBean(JavaScriptLocalizeBean.class); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { } @Override public void destroy() { } }
发生上述情况的原因:DispatcherServlet(本质上还是一个普通的Servlet)通过init方法来创建自己专属的WebAppliactionContext,但是Servlet的初始化时间是晚于Filter的,所以在Filter是获取不到Bean的。详细可参考:http://hi.baidu.com/630270730/item/2b55a0d5cddba692260ae782。