spring 缺省:

  • 1.spring用DefaultListableBeanFactory.preInstantiateSingletons()建立bean实例
  • 2.缺省采用单例模式

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

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

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

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。

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);}
}

// 获取inspectionUtil bean
inspectionUtil = (InspectionUtil) SpringContextUtil.getBean("inspectionUtil");

注:

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

<bean id="springContextsUtil" class="com.sinosoft.sepmis.util.SpringContextsUtil" ></bean>

2、如果注入后仍然出现这个问题。
则修改 中的default-lazy-init=“false”。
或者是修改bean注入属性 
<bean id="springContextsUtil" class="com.sinosoft.sepmis.util.SpringContextsUtil" lazy-init="false">

转载于:https://www.cnblogs.com/a757956132/p/4353771.html

spring getbean 方法分析相关推荐

  1. Spring AOP方法分析

    Spring AOP方法分析 此示例显示如何配置Spring AOP方法概要分析.我们可以在任何服务(或其他)类中使用Spring AOP和任何方法,而无需在任何服务类中编写任何一行分析代码.面向方面 ...

  2. spring getBean()方法解析概述

    1.getBean(beanName) 整体概述 1.transformedBeanName(name) name可能是别名,将别名(alias)解析成真正的beanName 截取&beanN ...

  3. java spring getbean_spring getbean 方法分析(很实用!)

    在最近的项目中,有个地方我们不得不实用getBean的方法,自己从Spring context中获取bean进行数据库操作. 方法一(效率低,极易出现bug,不推荐使用): 刚刚开始的时候,我们使用这 ...

  4. spring getbean 方法

    在网上找到一篇比较好的spring gebean的方法文章 创建一个工具类SpringContextsUtil ,通过实现Spring中的ApplicationContextAware接口,在appl ...

  5. Spring refresh 方法分析之一

    三哥 内容来自[自学星球] 欢迎大家来了解我的星球,和星主(也就是我)一起学习 Java ,深入 Java 体系中的所有技术.我给自己定的时间是一年,无论结果如何,必定能给星球中的各位带来点东西. 想 ...

  6. Spring IoC 源码系列(五)getBean 流程分析

    一.FactoryBean 用法讲解 在分析源码流程之前,我们先来看一下 FactoryBean,乍一看这家伙和 BeanFactory 很像,它们都可以用来获取 bean 对象,简单来说 Facto ...

  7. Spring源码分析系列——bean创建过程分析(三)——工厂方法创建bean

    前言 spring创建bean的方式 测试代码准备 createBeanInstance()方法分析 instantiateUsingFactoryMethod()方法分析 总结 spring创建be ...

  8. 详解Spring中getBean()方法

    我们日常会经常使用getBean()方法从spring容器中获取我们需要的bean.那么,getBean()方法是怎么一步步完成从spring容器中获取bean的呢? 下面我们就通过源码分析一下. 一 ...

  9. Spring源码分析之getBean主流程分析

    当我们通过向Spring容器获取某个bean的时候,总是调用Spring中重载的各种getBean方法.那么,getBean中的流程是什么样的? 通过本文,你将对getBean方法的主流程有一个详细的 ...

最新文章

  1. Ubuntu安装MongoDB
  2. 3d打印主要的切片参数类型_3D打印机教程 | 模型切片参数设置教程
  3. 基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程
  4. EasyUI –tree、combotree学习总结
  5. python中可以作为定界符_在 Python 中,字典和集合都是用一对 作为定界符,字典的每个元素有两部分组成,即 和 ,其中 不允许重复。_学小易找答案...
  6. .Net Core 3.0依赖注入替换 Autofac
  7. devops的重要性_为什么反馈而不是指标对DevOps至关重要
  8. wav格式的音频文件 16位转化成8位的
  9. nginx日志切割脚本
  10. linux系统访问sftp,Linux上设置用户通过SFTP访问目录的权限的方法
  11. MNIST 数据集下载 与 保存为图片格式
  12. JPGPNG图片压缩java实现
  13. AR实战开源项目——Miku和“极乐净土”
  14. 谷歌拼音输入法之初用
  15. 用聚宽量化炒股-5获取数据函数-8)获取概念成分股代码函数get_concept_stocks、查询股票所属概念板块函数get_concept()
  16. 检查等高线矛盾lisp_依仁测绘工具V1.0 整理了一个配合cass绘图的程序-依仁测绘工具 联合开发网 - pudn.com...
  17. FANUC机器人有关动作速度倍率的相关系统变量-解释说明
  18. 将实际环节都拆成了理论公式后,做好抽奖活动其实不难!
  19. springboot启动报org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean..
  20. lin通讯从节点同步间隔场_LIN模块介绍

热门文章

  1. druid连接池mysql5.7_Spring Boot 使用Druid连接池整合Mybatis-Plus连接Mysql数据库
  2. 50兆 svg 文件超过_中山兆驰产业园项目开工,预计竣工投产时间为…
  3. 学习编程做笔记的软件_可以在图片上做笔记的软件
  4. 002_SpringBoot整合Servlet
  5. 002_jQuery语法
  6. 024_html列表
  7. python爬虫论文摘要怎么写_Python爬虫基础教学(写给入门的新手)
  8. java中抽象类和接口的作用与区别
  9. c# redis hashid如何设置过期时间_Redis数据库实现原理(划重点)
  10. Java之线程安全的几种方式