在很多情况,我们需要先获取spring容器上下文,即webApplicationContext,然后通过webApplicationContext来获取其中的bean。典型的情况是,我想在一个并未委托给spring容器管理的对象里,去引用一个spring容器管理的对象,此时,@Resource注解是无法发挥作用的。此时必须使用webApplicationContext.getBean("beanName")才能从容器中取到这个java对象,不然我们就只能自己去new了。

  方法1::ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

  经验证是可行的,但是有个问题,就是执行这句代码的时候很耗时。本人猜测这句代码会重新new一个容器对象,相当于重新载入了一次applicationContext.xml里面配置的类,重新去create一个ApplicationContext,而不是去拿在项目启动之初生成的那个ApplicationContext。

  方法2.首先建立一个工具类

package com.wonyen.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; public class MySpringContext implements ApplicationContextAware {
private static ApplicationContext context;//声明一个静态变量用于保存spring容器上下文 @Override
public void setApplicationContext(ApplicationContext context)
throws BeansException {
this.context=context;
}
public static ApplicationContext getContext(){
return context;
} }

  1.可见该工具类实现了ApplicationContextAware接口,实现该接口的类会接收到spring容器传过来的ApplicationContext对象,从而可以实现操纵spring容器中的所有bean的效果。但是这里我们并不在这个工具类里面去获取bean,我们暂且把获取来的ApplicationContext对象存放起来,放在哪里呢,就是放在该类的一个静态变量中context中,然后我们再给它一个静态的get方法,供其他的类去调用。

  2.有了这个工具类还没用,spring容器不会无缘无故去执行setApplicationContext方法把ApplicationContext 对象传入给它,所以必须在ApplicationContext.xml文件里面去配置,如下所示。

<!-- util -->
<bean class="com.wonyen.util.MySpringContext"></bean>

  这样,当项目启动时,就会加载这个工具类,并把ApplicationContext 传入。当然你也可以采用注解的方式,即在该类上加上@Component注解。

  3.在其他类调用,只需要这样一行代码就可以了。

ApplicationContext context =MySpringContext.getContext();

  经验证,采用这种方式获取的ApplicationContext的速度明显比前面那种快很多。

  方法3:还有一种方法可以获取ApplicationContext,就是传入一个ServletContext对象。然后用WebApplicationContextUtils的getWebApplicationContext获取一个WebApplicationContext,WebApplicationContext是ApplicationContext的子类,他比ApplicationContext类多了一个获取ServletContext的方法。

ServletContext servletContext = event.getServletContext();
ApplicationContext application = WebApplicationContextUtils
.getWebApplicationContext(servletContext);

  其实上述方法能获取到WebApplicationContext时因为web项目在启动的时候,在启动spring容器的时候,把WebApplicationContext作为一个属性放入了ServletContext中,所以我们才可以采用spring提供的这个方法来获取到WebApplicationContext。

  方法4:因为WebApplicationContext是ApplicationContext的子类,所以获取到WebApplicationContext其实就是获取到了ApplicationContext。所以还有一种更为简单的方法,直接通过ContextLoader的静态方法getCurrentWebApplicationContext()就可以获取到当前的WebApplicationContext对象.

代码如下:

WebApplicationContext webApplicationContext = ContextLoader
.getCurrentWebApplicationContext();

  PSSS:关于第一种方法和后面三种方法,为了验证猜想,即采用new ClassPathXmlApplicationContext("applicationContext.xml");这种方法会重新生成一个ApplicationContext对象,做了如下代码的验证。

ApplicationContext context = MySpringContext.getContext();
ApplicationContext newContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
System.out.println("获取已有的ApplicationContext对象" + context);
System.out.println("新建的ApplicationContext" + newContext);

  得到的结果是:

  可见这两个确实不是同一个对象。验证成功。

获取spring容器上下文(webApplicationContext)的几种方法的更多相关文章

  1. 普通Java类获取spring 容器的bean的5种方法

    方法一:在初始化时保存ApplicationContext对象方法二:通过Spring提供的工具类获取ApplicationContext对象方法三:继承自抽象类ApplicationObjectSu ...

  2. 【Spring学习笔记-3.1】让bean获取spring容器上下文(applicationContext.xml)

    *.hl_mark_KMSmartTagPinkImg{background-color:#ffaaff;}*.hl_mark_KMSmartTagBlueImg{background-color:# ...

  3. Java代码获取spring 容器的bean几种方式

    一.目的 写了一个项目,多个module,然后想在A模块中实现固定的config注入,当B模块引用A时候,能够直接填写相对应的配置信息就行了.但是遇到一个问题,B引用A时候,A的配置信息总是填充不了, ...

  4. 一种获取spring环境上下文方法:SpringContextUtil

    获得spring里注册Bean的有好几种方法,这里介绍一种比较简单的方法: import org.springframework.beans.BeansException; import org.sp ...

  5. spring 获取 WebApplicationContext的几种方法

    spring 获取 WebApplicationContext的几种方法 使用ContextLoader WebApplicationContext webApplicationContext = C ...

  6. 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean

    7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...

  7. Spring注解@Resource和@Autowired区别对比、spring扫描的默认bean的Id、程序获取spring容器对象

    -------------------------注解扫面的bean的ID问题-------------------------- 0.前提需要明白注解扫描出来的bean的id默认是类名首字母小写,当 ...

  8. java web中如何获取spring容器中定义的bean----WebApplicationContext的使用

    本文简单编写一个servlet来获取spring容器中管理的<bean  id="dateBean" class="java.util.Date" sin ...

  9. 获取Spring容器中的Bean协助调试

    在使用Spring进行开发时,有时调bug真的是很伤脑筋的一件事,我们可以通过自定义一个监听器来获取Spring容器中的Bean实例来协助我们调试. 第一步:编写自定义监听器 /** * 监听serv ...

随机推荐

  1. 免费好用的阿里云云盾证书服务(https证书)申请步骤

    推荐一个免费的阿里云产品:云盾证书(https证书) 为了能让非专业人士看懂,同样尽量用直白的话,一般来说:当你个人需要建立网站,或者公司要建立官网.商城,通常需要先购买服务器或云主机,虚拟空间,然后 ...

  2. docker下编译mangoszero WOW60级服务端(一)

    这几天看到暴雪准备开放怀旧服的新闻,突然想到几年前用大芒果window一键服务端自己搭建过服务,就想着在Linux环境下重新编译一套,毕竟Linux作为服务端,性能和稳定性都会高一些,于是在mac虚拟 ...

  3. C#动态获取鼠标坐标

    .Net封装好的方法 int Control.MousePosition.X;int Control.MousePosition.Y; 用API方法 using System.Runtime.Inte ...

  4. mac环境下支持PHP调试工具xdebug,不需要建项目server

    先让php支持xdebug 方式一: https://xdebug.org/download.php 下载相应的xdebug  可以到http://xdebug.org/wizard.php 把php ...

  5. 2017年当下最值得你关注的前端开发框架,不知道你就OUT了!

    近几年随着 jQuery.Ext 以及 CSS3 的发展,以 Bootstrap 为代表的前端开发框架如雨后春笋般挤入视野,可谓应接不暇. 在这篇分享中,我将总结2017年当下最值得你关注的前端开发框 ...

  6. 《Linux命令行与shell脚本编程大全》第九章 安装软件程序

    包管理系统(PMS):用来进行软件安装.管理和删除的命令行工具 9.1包管理基础 1.主流的Linux发行版都采用了某种形式的包管理系统来控制软件和库的安装 2.PMS用一个数据库来记录:系统上安装了 ...

  7. Java中断机制(interrupt)

    中断线程 在 run() 方法中,如果语句执行到了最会一句,或是遇到 return 方法,或是方法中出现了没有被捕获的异常,run() 方法将会执行结束.在java中,Thread中的interrup ...

  8. [转载] Thrift-server与spring集成

    转载自http://shift-alt-ctrl.iteye.com/blog/1990026 Thrift服务server端,其实就是一个ServerSocket线程 + 处理器,当Thrift-c ...

  9. 基于 HTML5 WebGL 的 3D “弹力”布局

    分子力(molecular force),又称分子间作用力.范得瓦耳斯力,是指分子间的相互作用.当二分子相距较远时,主要表现为吸引力,这种力主要来源于一个分子被另一个分子随时间迅速变化的电偶极矩所极化 ...

  10. Mac OS X更新VirtualBox以后Genymotion无法启动的一种情况

    这两天VirtualBox更新到5.0了,于是乎就升级了.结果升级后就中了个大奖,Genymotion起不来了.我用的是Genymotion 2.5,不久前刚升级的,因为官网打不开,不知是不是最新版. ...