在最近的项目中,有个地方我们不得不实用getBean的方法,自己从Spring context中获取bean进行数据库操作。

方法一(效率低,极易出现bug,不推荐使用):

刚刚开始的时候,我们使用这中方式,但是在应用过程中发现此方式效率低下,而且极易出现bug。
在我们系统中会生成ehcache_auto_created_时间戳文件夹,

<!-- lang: java -->
String[] xmlCfg = new String[] {"classpath:/spring/applicationContext-service.xml",
"classpath:/spring/applicationContext-util.xml",
"classpath:/spring/applicationContext.xml"};
ApplicationContext context = new FileSystemXmlApplicationContext(xmlCfg);
// 获取inspectionUtil bean
inspectionUtil = (InspectionUtil) context.getBean("inspectionUtil");

所以我google了一下,改用其他方法。

方法二(效率高,灵活性高,可复用,推荐使用):
创建一个工具类SpringContextsUtil ,通过实现Spring中的ApplicationContextAware接口,在applicationContext.xml中注入bean后Spring会自动调用setApplicationContext方法。此时我们就可以获取到Spring context。

<!-- lang: java -->
public class SpringContextsUtil implements ApplicationContextAware{ private static ApplicationContext applicationContext; //Spring应用上下文环境

/**
  • 实现ApplicationContextAware接口的回调方法,设置上下文环境
  • @param applicationContext
  • @throws BeansException

    */

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

    SpringContextsUtil.applicationContext = applicationContext;

    }
/**
  • @return ApplicationContext

    */

    public static ApplicationContext getApplicationContext() {

    return applicationContext;

    }
/**
  • 获取对象
  • @param name
  • @return Object 一个以所给名字注册的bean的实例
  • @throws BeansException

    */

    public static Object getBean(String name) throws BeansException {

    return applicationContext.getBean(name);

    }
/**
  • 获取类型为requiredType的对象
  • 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)
  • @param name bean注册名
  • @param requiredType 返回对象类型
  • @return Object 返回requiredType类型对象
  • @throws BeansException

    */

    public static Object getBean(String name, Class requiredType) throws BeansException {

    return applicationContext.getBean(name, requiredType);

    }
/**
  • 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
  • @param name
  • @return boolean

    */

    public static boolean containsBean(String name) {

    return applicationContext.containsBean(name);

    }
/**
  • 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
  • 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
  • @param name
  • @return boolean
  • @throws NoSuchBeanDefinitionException

    */

    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {

    return applicationContext.isSingleton(name);

    }
/**
  • @param name
  • @return Class 注册对象的类型
  • @throws NoSuchBeanDefinitionException

    */

    public static Class getType(String name) throws NoSuchBeanDefinitionException {

    return applicationContext.getType(name);

    }
/**
  • 如果给定的bean名字在bean定义中有别名,则返回这些别名
  • @param name
  • @return
  • @throws NoSuchBeanDefinitionException

    */

    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {

    return applicationContext.getAliases(name);

    }

    }

调用方法:

<!-- lang: java -->
// 获取inspectionUtil bean
inspectionUtil = (InspectionUtil) SpringContextUtil.getBean("inspectionUtil");

注:

1、使用时会出现无法获取applicationContext,并抛出NullPointerException。
原因:使用此方法必须在spring applicationContext.xml中注入bean。否则spring无法自动调用setApplicationContext。如下

<!-- lang: xml -->
<bean id="springContextsUtil" class="com.sinosoft.sepmis.util.SpringContextsUtil" ></bean>

2、如果注入后仍然出现这个问题。
则修改<beans default-autowire="byName" default-lazy-init="true">中的default-lazy-init="false"。
或者是修改bean注入属性

<!-- lang: xml -->
<bean id="springContextsUtil" class="com.sinosoft.sepmis.util.SpringContextsUtil" lazy-init="false"></bean>
                                                <div class="ad-wrap" style="margin-top: 12px;">
<div data-traceid="blog_down_1" data-tracepid="blog_down" style="text-align:center">
<!-- oschina-blog-728x90 -->
<ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-7090564139599510" data-ad-slot="5590362768"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
<script type="text/javascript">
function googleAdJSAtOnload() {
var element = document.createElement("script");
element.src = "//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js";
element.async = true;
document.body.appendChild(element);
}
if (window.addEventListener) {
window.addEventListener("load", googleAdJSAtOnload, false);
} else if (window.attachEvent) {
window.attachEvent("onload", googleAdJSAtOnload);
} else {
window.onload = googleAdJSAtOnload;
}
</script>

spring getbean 方法分析(很实用!)的更多相关文章

  1. spring getbean 方法分析

    spring 缺省: 1.spring用DefaultListableBeanFactory.preInstantiateSingletons()建立bean实例 2.缺省采用单例模式 在最近的项目中 ...

  2. 检测代理IP匿名程度的方法,很实用

    做网络的基本都知道代理,这个是肯定的,不管是用花刺还是猎手的网页代理,还是直接VPN的通道代理,代理有着不用说大家也知道的重要性.不管是做CPA还是做点击亦或者投票,代理都能帮我们一下,虽然帮的忙不大 ...

  3. 由于开发需求需要在附件查看页面添加水印,于是网上看到一位大牛写了一个js加水印的方法觉得很实用,也很方便,记录一下,哈哈

    大牛的博客链接:https://www.cnblogs.com/daixinyu/p/6715398.html 提供给大家学习 我优化了几点 1,我把水印的样式单独提出来,这样会提高渲染水印的性能 2 ...

  4. Spring IoC getBean 方法详解

    前言 本篇文章主要介绍 Spring IoC 容器 getBean() 方法. 下图是一个大致的流程图: 正文 首先定义一个简单的 POJO,如下: public class User { priva ...

  5. spring容器的refresh方法分析

    spring源码版本5.0.5 Spring容器创建之后,会调用它的refresh方法刷新Spring应用的上下文. 首先整体查看AbstractApplicationContext#refresh源 ...

  6. Spring BeanFacoty doCreateBean方法分析

    上一篇,我们分析到了doCreateBean,现在继续: 先看看时序图 protected Object doCreateBean(final String beanName, final RootB ...

  7. 模拟Spring中的getBean方法

    一直知道Spring是运用反射技术的,但具体怎么用呢?今天就模拟下getBean方法. 步骤: 1.用Dom4j解析xml配置文件,取出我们需要的信息 2.遍历Bean节点,根据每个Bean节点的cl ...

  8. 模拟Spring容器的getBean方法(Maven工程)

    Spring容器的getBean方法是通过反射机制实现的,下面的测试程序模拟getBean的实现原理. 步骤一:pom.xml文件配置解析XML文件的dom4j.jar 步骤二:XML文件中配置bea ...

  9. Spring之BeanFactory:解析getBean()方法

    初探getBean()方法 在使用Spring的时候可以通过如下方式调用getBean方法来获取某个Bean: User user = context.getBean(User.class); Abs ...

随机推荐

  1. .Net中的缓存依赖配置

    缓存--能非常好的提高网站的性能. 在訪问量大,但更新较少的站点中使用缓存,能够大大提高执行效率. 在.net中给我们提供了非常好的缓存机制.页面缓存.数据缓存,还有非常好的依赖缓存. 依赖缓存优点就 ...

  2. 【Android个人理解(八)】跨应用调用不同组件的方法

    如果情景: 创建两个应用appA和appB,appA包括一个Service,此Service有一个堵塞方法每隔10秒钟产生一个随机数字,例如以下: public int getRandomInt(){ ...

  3. apache activemq Failed to bind to server socket 61616

    windows环境上: 首先 nestat -ano | findstr "61616" 查看是否有进程,有的话kill掉, 若没有发现,查看windows Internet Co ...

  4. AngularJS渲染性能分析

    作者:Jiang, Jilin AngularJS中,通过数据绑定.能够十分方便的构建页面.可是当面对复杂的循环嵌套结构时,渲染会遇到性能瓶颈.今天,我们将通过一些列实验,来測试AngularJS的渲 ...

  5. js33--责任链模式

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  6. zendiscovery 的Ping机制

    ping是集群发现的基本手段,通过在网络上广播或者指定ping某些节点获取集群信息,从而可以找到集群的master加入集群.zenDiscovery实现了两种凭机制:广播与单播.本篇将详细分析一些这M ...

  7. Mysql数据库的瓶颈处理一点建议

    Mysql数据库的瓶颈处理一点建议         我们在使用Mysql数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候.磁盘I/O瓶颈的出 ...

  8. (转)Linux下使用rsync最快速删除海量文件的方法

    转自 : http://www.ha97.com/4107.html 昨天遇到了要在Linux下删除海量文件的情况,需要删除数十万个文件.这个是之前的程序写的日志,增长很快,而且没什么用.这个时候,我 ...

  9. Java经典23种设计模式之行为型模式(二)

    本文接着介绍行为型模式里的解释器模式.迭代器模式.中介者模式. 一.解释器模式Interpret 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言的中的句子. 1 ...

  10. color-在framwork中添加属性变量

    1.今天在修改framwork中的代码的时候,需要把自己在代码中写的一个#ffffff,变成在xml中引用的变量.具体操作方法如下 1)在 frameworks/base/core/res/res/v ...