我们经常需要获取各种 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")
@Override
public 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 { @Test
public 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注解后,会自动加载配置文件。

[Java] ApplicationContext 辅助类的更多相关文章

  1. Java并发辅助类的使用

    目录 1.概述 2.CountdownLatch 2-1.构造方法 2-2.重要方法 2-3.使用示例 3.CyclicBarrier 3-1.构造方法 3-2.使用示例 4.Semaphore 4- ...

  2. 第65节:Java后端的学习之Spring基础

    Java后端的学习之Spring基础 如果要学习spring,那么什么是框架,spring又是什么呢?学习spring中的ioc和bean,以及aop,IOC,Bean,AOP,(配置,注解,api) ...

  3. 【Spring】浅析Spring框架的搭建

    c目录结构: // contents structure [-] Spring是什么 搭建Spring框架 简单Demo 1,建立User类 2,建立Test类 3,建立ApplicationCont ...

  4. Spring学习笔记 1. 尚硅谷_佟刚_Spring_HelloWorld

    1,准备工作 (1)安装spring插件 搜索https://spring.io/tools/sts/all就可以下载最新的版本 下载之后不用解压,使用Eclipse进行安装.在菜单栏最右面的Help ...

  5. Spring学习进阶(二)Spring IoC

    在使用Spring所提供的各种丰富而神奇的功能之前,必须在Spring IoC容器中装配好Bean,并建立Bean与Bean之间的关联关系.控制反转(Inverser of Control ioc)是 ...

  6. spring学习起步

    1.搭载环境 去spring官网下载这几个包,其中commons-logging-1.2.jar是一个日志包,是spring所依赖的包,可以到apache官网上下载 也可以访问http://downl ...

  7. Spring源码阅读-spring启动

    web.xml web.xml中的spring容器配置 <listener> <listener-class>org.springframework.web.context.C ...

  8. 实战 PureMVC

    最近看PureMVC,在IBM开发者社区发现此文,对PureMVC的讲解清晰简洁,看了可快速入门.另外,<腾讯桌球>游戏的开发者吴秦,也曾进一步剖析PureMVC,可结合看加深理解. 引言 ...

  9. spring的配置与使用

    spring的配置与使用 一.Spring介绍 1. 什么是Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 RodJohnson 在其著 ...

随机推荐

  1. Echarts在JavaWeb中与后台的交互实现

    本Web系统后台框架是:Spring+SpringMVC+Mybatis+Shiro+Maven.完整系统搭建的配置过程见上一篇文章:基于Spring+SpringMVC+Mybatis的Web系统搭 ...

  2. Web系统性能测试术语简介

    并发用户 并发一般分为两种情况.一种是严格意义上的并发,即所有的用户在同一时刻做同一件事情或者操作.这种操作一般指做同一类型的业务,比如在信用卡审批业务中,一定数目的用户在同一时刻对已经完成的审批业务 ...

  3. Mac MySQL启动不了解决办法(MySQL卸载重新安装教程)

    一段时间没用MySQL,今天使用时突然发现启动不了了,怎么点start都没用,或者输入密码了  还是没用... 好急...找了一圈资料,没发现特别好的解决办法,只能使用大招了----->< ...

  4. Python version 3.4 required, which was not found in the registry.解决

    问题描述: 在Win7环境下已安装Python3.4,准备安装numpy和nltk,运行安装程序报如题错误,具体解决方案如下: 1.将LOCAL_MACHINE\software\python\Pyh ...

  5. js给数组去重写法

    数组为 var list =['A','B','A']; 法一:常规做法,新建list,给list添加元素,添加前判断是否包含 var removeRepeatItem = function(list ...

  6. O(1)效率的表面模糊算法优化。

    很久没有写文章了,主要是最近一段时间没有以前那么多空暇空间,内存和CPU占用率一致都很高,应前几日群里网友的要求,今天发个表面模糊的小程序来找回之前写博客的热情吧. 国内我认为,破解表面模糊的原理的最 ...

  7. "高大上" 名词整理

    大家在和朋友,同行交流时有没有经常遇到各种 "高大上" 的术语,很多词有没有把各位 “鸟哥” 们搞得一头雾水,现在我就把这些 "牛逼" 的东东都罗列一下, 大家 ...

  8. [AR]高通Vuforia Getting Started

    Vuforia Getting Started 简介 ​ Vuforia创建增强现实应用程序是一个软件平台.开发人员可以轻松地将先进的计算机视觉功能添加到任何应用程序中,允许它识别图像和对象,或在现实 ...

  9. ngx_http_upstream_module模块.md

    ngx_http_upstream_module ngx_http_upstream_module模块用于定义可由proxy_pass,fastcgi_pass,uwsgi_pass,scgi_pas ...

  10. java 成长之路[轉載u]

    分享总结title: java 成长之路tags:grammar_cjkRuby: true 经验差异 1-3年 要求 建议 3-5年 建议 5年+ 经验差异 最近一年比较忙,经历了创业公司的倒闭.这 ...