我们经常需要获取各种 bean , 需要用到 context。

下面的类可以方便的使用 context , 获取 bean 等。

import java.io.File;
import java.util.ArrayList;
import java.util.List;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;/*** 单例上下文对象,配合 spring 使用, 用于获取 Bean* @author YangYxd* @see 在配置中(applicationContext.xml) 加入 * <bean id="SpringApplicationContext" class="包名.ContextHelper"></bean> */
public class ContextHelper implements ApplicationContextAware {private static String XMLName = "applicationContext.xml";private static ApplicationContext applicationContext = null;private static class ApplicationContextHolder {         // 初始化 Context, 尝试搜索常用的存放 ApplicationContext.xml 的位置public static ApplicationContext Init() {ApplicationContext context = null;   try {context = new ClassPathXmlApplicationContext(XMLName);  } catch (Exception e) {}// 在当前项目中搜索配置文件if (context == null) {try {String fileName = findFile(System.getProperty("user.dir"), XMLName);if (fileName != null)context = new FileSystemXmlApplicationContext(fileName);  } catch (Exception e) {} }return context;}      }// 私有化的构造方法,保证外部的类不能通过构造器来实例化。  private ContextHelper() {}/** 设定 XML 名称 */synchronized public static void setXmlName(String name) {XMLName = name;}// 获取单例对象实例  synchronized public static ApplicationContext getInstance() {  if (applicationContext != null)return applicationContext;applicationContext = ApplicationContextHolder.Init();return applicationContext;  }/** * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true  * @param name * @return boolean */  public static boolean containsBean(String name) {  return getInstance().containsBean(name);  }/** * @param name * @return Class 注册对象的类型 */public static Class<?> getType(String name) { try {return getInstance().getType(name);} catch (Exception e) {return null;}}  /** * 如果给定的bean名字在bean定义中有别名,则返回这些别名    * @param name * @return*/  public static String[] getAliases(String name)  {try {return getInstance().getAliases(name); } catch (Exception e) {return null;}}  /** * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 * 如果与给定名字相应的bean定义没有被找到,也会返回 false  * @param name * @return boolean */  public static boolean isSingleton(String name) {try {return getInstance().isSingleton(name);  } catch (Exception e) {return false;}}@SuppressWarnings("static-access")@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;System.out.println("ApplicationContextHelper setApplicationContext OK.");}/**   * 查找文件   * @param baseDirName  查找的文件夹路径   * @param targetFileName  需要查找的文件名   */    public static String findFile(String baseDirName, String targetFileName) {   List<File> files = new ArrayList<File>();findFiles(baseDirName, targetFileName, files, true);if (files.isEmpty())return null;return files.get(0).getPath();}/**   * 递归查找文件   * @param baseDirName  查找的文件夹路径   * @param targetFileName  需要查找的文件名   * @param fileList  查找到的文件集合   * @param onlyFirst  是否是查找第一个*/    public static void findFiles(String baseDirName, String targetFileName, List<File> fileList, Boolean onlyFirst) {     File baseDir = new File(baseDirName);       // 创建一个File对象  if (!baseDir.exists() || !baseDir.isDirectory()) {  // 判断目录是否存在  System.out.println("文件查找失败:" + baseDirName + "不是一个目录!");  }  String tempName = null;     //判断目录是否存在
        File tempFile;  File[] files = baseDir.listFiles();  for (int i = 0; i < files.length; i++) {  tempFile = files[i];  if(tempFile.isDirectory()){  findFiles(tempFile.getAbsolutePath(), targetFileName, fileList, onlyFirst);  }else if(tempFile.isFile()){  tempName = tempFile.getName();if (tempName != null && tempName.equalsIgnoreCase(targetFileName)) {  // 匹配成功,将文件名添加到结果集
                    fileList.add(tempFile.getAbsoluteFile()); if (onlyFirst)return;}  }  }  }/*** 获取 Bean* @param beanName* @return*/    @SuppressWarnings("unchecked")public static <T extends Object> T getBean(String beanName) {try {return (T)getInstance().getBean(beanName);} catch (BeansException e) {e.printStackTrace();return null;}}/*** 获取 Bean* @param beanName* @param clazz* @return*/public static <T extends Object> T getBean(String beanName , Class<T>clazz) {  return getInstance().getBean(beanName , clazz);  }/*** @param clazz 通过类模板获取该类* @return 该类的实例,默认单例*/public static <T extends Object> T getBean(Class<T> clazz){try {return getInstance().getBean(clazz);} catch (BeansException e) {e.printStackTrace();return null;}}}

在单元测试中使用:

package com.yxd.example.bean;import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.springframework.test.context.ContextConfiguration;@RunWith(BlockJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext.xml"})
public class SpringTest {@Testpublic void enumBeans() {//获取spring装配的bean个数  int beanCount = ContextHelper.getInstance().getBeanDefinitionNames().length;  //逐个打印出spring自动装配的bean。根据我的测试,类名第一个字母小写即bean的名字  for(int i=0; i<beanCount; i++){  System.out.println(ContextHelper.getInstance().getBeanDefinitionNames()[i]);  }}
}

在这个测试类中,加入ContextConfiguration注解后,会自动加载配置文件。

转载于:https://www.cnblogs.com/yangyxd/p/6000068.html

[Java] ApplicationContext 辅助类相关推荐

  1. Java数据结构和算法:哈夫曼树

    本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若 ...

  2. java获取当前周一_Java互联网架构-Spring IOC源码分析

    欢迎关注头条号:java小马哥 周一至周日下午三点半!精品技术文章准时送上!!! 精品学习资料获取通道,参见文末 源码介绍之前,看几个问题: Bean的承载对象是什么? Bean的定义如何存储的? B ...

  3. java动态创建bean的意义_java相关:Spring Boot如何动态创建Bean示例代码

    java相关:Spring Boot如何动态创建Bean示例代码 发布于 2020-3-20| 复制链接 摘记: 前言本文主要给大家介绍了关于Spring Boot动态创建Bean的相关内容,分享出来 ...

  4. spring 加载java类_在Spring中基于Java类进行配置的完整步骤

    在Spring中基于Java类进行配置的完整步骤 发布于 2020-7-7| 复制链接 基于Java配置选项,可以编写大多数的Spring不用配置XML,下面 前言JavaConfig 原来是 Spr ...

  5. pojo类无法注入service解决示例

    From:  https://blog.csdn.net/danielzhou888/article/details/83351913 本示例解决springboot中service无法注入普通jop ...

  6. 通用分页实现及其OO设计探讨

    分页是一种常用的页面数据显示技术,分页能够通过减少页面数据处理量从而提高了系统的性能.分页应该是做WEB开发必须掌握的一个小技术.而分页却是复杂的,倒不是它的技术有多复杂:而是有太多的重复代码,这些代 ...

  7. 手写简版spring --10--容器事件和事件监听器

    一.降低耦合 解耦场景在互联网开发的设计中使用的也是非常频繁,如:这里需要一个注册完成事件推送消息.用户下单我会发送一个MQ.收到我的支付消息就可以发货了等等,都是依靠事件订阅和发布以及MQ消息这样的 ...

  8. 手写简版spring --9--对象作用域和FactoryBean

    一.目标 交给 Spring 管理的 Bean 对象,一定就是我们用类创建出来的 Bean 吗?创建出来的 Bean 就永远是单例的吗,没有可能是原型模式吗?在集合 Spring 框架下,我们使用的 ...

  9. 手写简版spring --8--Aware感知容器对象Aware感知容器对象

    一.目标 目前已实现的 Spring 框架,在 Bean 操作上能提供出的能力,包括:Bean 对象的定义和注册,以及在操作 Bean 对象过程中执行的,BeanFactoryPostProcesso ...

最新文章

  1. Java项目:成绩管理系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
  2. 七天学会ASP.NET MVC (五)——Layout页面使用和用户角色管理
  3. 成功解决ValueError: fill value must be in categories
  4. ant构建项目迁移到gradle_Gradle构建工具
  5. 研发人员为什么留不住
  6. mysql myisam 支持事务吗_第三章(附)mysql表类型MyISAM和InnoDB区别(决定了是否支持事务)...
  7. 京东炸年兽活动一键做任务工具v1.7
  8. 轻松构建Tomcat源码
  9. Await Async和Thread.waitAll想法?未完待续
  10. ACM字符串处理算法经典:字符串搜索
  11. mysql 主从 日志_mysql主从复制基于日志复制
  12. 详解CAN总线:什么是CAN总线?
  13. 阿里面试题:设计相关的系统对外提供商品实时价格获取功能
  14. 「数据架构」什么是实体关系图(ERD)?
  15. 寒霜朋克计算机丢失,寒霜朋克停止工作怎么办 寒霜朋克停止工作解决方法
  16. Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“(已解决)
  17. RealView 应用
  18. git HEAD切换
  19. 道一HTTP测试工具功能升级
  20. 协方差及协方差矩阵的理解

热门文章

  1. 今天上网感觉有点儿卡,上了路由器一看,数据包狂跳
  2. python中类型错误、计数不采用关键字的错误怎么改_Python设计错误
  3. nodejs mysql事务处理_关于NodeJs如何使用Mysql模块实现事务处理实例
  4. e3是合法浮点数吗_下面4个选项中,均是合法浮点数的选项是?
  5. 编写第一个Java程序:helloworld
  6. 第四章类和对象 习题答案
  7. 高性能RPC框架—----------------------Dubbo一站式快速入门
  8. 互联网晚报 | 11月20日 星期六 | 阿里云单季营收首次超200亿;淘特年度活跃用户超2.4亿;首届中国网络文明大会在京召开...
  9. 手把手教你编写接口需求文档
  10. isinstanceof java_scala中的isInstanceOf和asInstanceOf