第一种:
通常用ApplicationContext来调用Spring配置文件中的一些Bean,所以首先创建Spring上下文容器。
ApplicationContext ac = (ApplicationContext) invocation.getInvocationContext().getApplication().get(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
以上代码中invocation是Struts2拦截器方法intercept(ActionInvocation invocation)方法的参数
其中ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE在源码中是这样定义的:
String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";
所以通过此种方式可以得到ApplicationContext
第二种:
ServletContext sc=ServletActionContext.getServletContext();
ApplicationContext ctx=WebApplicationContextUtils.getWebApplicationContext(sc);
首先获取Servlet上下文(这是Struts2访问Servlet三种方式中的一种)
Spring给我们提供了WebApplicationContext的工具类很方便的访问WebApplicationContext,这种方式比上一种简单,
但是如果仔细查看WebApplicationContextUtils的getWebApplicationContext(ServletContext sc)的源码会发现还是会用到ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,所以归根结底它们的原理一样。
public static WebApplicationContext getWebApplicationContext(ServletContext sc) {
return getWebApplicationContext(sc, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
}