怎么获取Spring的ApplicationContext

 我来答
蘑菇饭资讯
推荐于2016-01-26 · TA获得超过6万个赞
知道大有可为答主
回答量:1.7万
采纳率:90%
帮助的人:1.2亿
展开全部
在 WEB 开发中,可能会很少需要显示的获得 ApplicationContext 来得到由 Spring 进行管理的某些 Bean, 今天我就遇到了,在这里和大家分享一下, WEB 开发中,怎么获取 ApplicationContext
一 要想怎么获取 ApplicationContext, 首先必须明白 Spring 内部 ApplicationContext 是怎样存储的。下面我们来跟踪一下源码
首先:从大家最熟悉的地方开始
Java代码收藏代码
org.springframework.web.context.ContextLoaderListener
上面这一段,大家很熟悉吧。好,让我们看一看它到底实现了些啥。
Java代码收藏代码
public class ContextLoaderListenerimplements ServletContextListener{
private ContextLoader contextLoader;
/**
* Initialize the root web application context.
*/
public voidcontextInitialized(ServletContextEvent event) {
this.contextLoader = createContextLoader();
this.contextLoader.initWebApplicationContext(event.getServletContext());
}//下面的略
显然,ContextLoaderListener实现了ServeletContextListenet,在ServletContext初始化的时候,会进行Spring的初始化,大家肯定会想,Spring的初始化应该与ServletContext有一定关系吧?有关系吗?接下来让我们进入
ContextLoader.initWebApplicationContext方法
Java代码收藏代码
public WebApplicationContext initWebApplicationContext(ServletContext servletContext)
throws IllegalStateException, BeansException {
//从ServletContext中查找,是否存在以WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE为Key的值Java代码收藏代码
if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null){
throw new IllegalStateException(
"Cannot initialize context because there is already a root application context present - " +
"check whether you have multiple ContextLoader* definitions in your web.xml!");
}
try {
// Determine parent for root web application context, if any.
ApplicationContext parent = loadParentContext(servletContext);
// it is available on ServletContext shutdown.
this.context = createWebApplicationContext(servletContext, parent);
//将ApplicationContext放入ServletContext中,其key为WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTEJava代码收藏代码
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
//将ApplicationContext放入ContextLoader的全局静态常量Map中,其中key为:Thread.currentThread().getContextClassLoader()即当前线程类加载器Java代码收藏代码
currentContextPerThread.put(Thread.currentThread().getContextClassLoader(), this.context);
return this.context;
}
从上面的代码大家应该明白了Spring初始化之后,将ApplicationContext存到在了两个地方,那么是不是意味着我们可以通过两种方式取得ApplicationContext?
第一种获取方式:
注意:WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";
即为 "org.springframework.web.context.WebApplicationContext.ROOT"
那么咱们是不是可以这样获得ApplicationContext:
Java代码收藏代码
request.getSession().getServletContext().getAttribute("org.springframework.web.context.WebApplicationContext.ROOT")
千锋教育
2015-12-09 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
展开全部
方法如下:
实现
   1.创建一个类让其实现org.springframework.context.ApplicationContextAware接口来让Spring在启动的时候为我们注入ApplicationContext对象.
  示例代码:
  import org.springframework.beans.BeansException;
  import org.springframework.context.ApplicationContext;
  import org.springframework.context.ApplicationContextAware;

  public class MyApplicationContextUtil implements ApplicationContextAware {
    private static ApplicationContext context;
    //声明一个静态变量保存
    public void setApplicationContext(ApplicationContext contex) throws BeansException {
      this.context=contex;
    }
    public static ApplicationContext getContext(){
      return context;
    }
    public final static Object getBean(String beanName){
      return context.getBean(beanName);
    }
    public final static Object getBean(String beanName, Class<?> requiredType) {
      return context.getBean(beanName, requiredType);
    }
  }
  2.在applicationContext.xml文件中配置此bean,以便让Spring启动时自动为我们注入ApplicationContext对象.
  例:
  <!-- 这个bean主要是为了得到ApplicationContext 所以它不需要其它属性-->
  <bean class="org.ing.springutil.MyApplicationContextUtil"></bean>
  3.有了这个ApplicationContext之后我们就可以调用其getBean("beanName")方法来得到由Spring 管理所有对象.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式