根据不同的整合方式,分别看一下WebApplicationContext的取得方式
1>业务Action extends ActionSupport
ActionSupport.java
protected final WebApplicationContext getWebApplicationContext() { return this.webApplicationContext; } protected WebApplicationContext initWebApplicationContext(ActionServlet actionServlet) throws IllegalStateException { return DelegatingActionUtils.findRequiredWebApplicationContext(actionServlet, null); } public void setServlet(ActionServlet actionServlet) { super.setServlet(actionServlet); if (actionServlet != null) { this.webApplicationContext = initWebApplicationContext(actionServlet); this.messageSourceAccessor = new MessageSourceAccessor(this.webApplicationContext); onInit(); } else { onDestroy(); } }
如果WebApplicationContext是通过struts plugin的方式加载的话,会直接获取default module的wac
2>使用DelegatingRequestProcessor
DelegatingRequestProcessor.java
private WebApplicationContext webApplicationContext; public void init(ActionServlet actionServlet, ModuleConfig moduleConfig) throws ServletException { super.init(actionServlet, moduleConfig); if (actionServlet != null) { this.webApplicationContext = initWebApplicationContext(actionServlet, moduleConfig); } } protected WebApplicationContext initWebApplicationContext( ActionServlet actionServlet, ModuleConfig moduleConfig) throws IllegalStateException { return DelegatingActionUtils.findRequiredWebApplicationContext(actionServlet, moduleConfig); } protected final WebApplicationContext getWebApplicationContext() { return this.webApplicationContext; }
3>所有的Action类都使用DelegatingActionProxy
DelegatingActionProxy.java
protected WebApplicationContext getWebApplicationContext( ActionServlet actionServlet, ModuleConfig moduleConfig) throws IllegalStateException { return DelegatingActionUtils.findRequiredWebApplicationContext(actionServlet, moduleConfig); }
可以发现,这三种整合方式,其实都是通过DelegatingActionUtils.findRequiredWebApplicationContext方法来获取wac的
那么,我们来看一下具体的内部代码
public static WebApplicationContext findRequiredWebApplicationContext( ActionServlet actionServlet, ModuleConfig moduleConfig) throws IllegalStateException { WebApplicationContext wac = getWebApplicationContext(actionServlet, moduleConfig); // If no Struts-specific context found, fall back to root context. if (wac == null) { wac = WebApplicationContextUtils.getRequiredWebApplicationContext(actionServlet.getServletContext()); } return wac; } public static WebApplicationContext getWebApplicationContext( ActionServlet actionServlet, ModuleConfig moduleConfig) { WebApplicationContext wac = null; String modulePrefix = null; // Try module-specific attribute. if (moduleConfig != null) { modulePrefix = moduleConfig.getPrefix(); wac = (WebApplicationContext) actionServlet.getServletContext().getAttribute( ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX + modulePrefix); } // If not found, try attribute for default module. if (wac == null && !"".equals(modulePrefix)) { wac = (WebApplicationContext) actionServlet.getServletContext().getAttribute( ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX); } return wac; }
获取逻辑是这样的:
1>先看是否通过struts plugin的方式进行了wac的加载
2>如果没有找到,再接着看是否通过servlet或者listener的方式进行了wac的加载