开发者社区> 沉默王二> 正文

Java利用spring注解做反射机制

简介: 版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/42002391 前言:一直觉得spring提供的注解装配bean机制非常的好,尤其是在做类似Java反射机制的时候太方便了,下面就依据项目需求进行一次记录,方便以后使用。
+关注继续查看
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/42002391

前言:一直觉得spring提供的注解装配bean机制非常的好,尤其是在做类似Java反射机制的时候太方便了,下面就依据项目需求进行一次记录,方便以后使用。


需求一句话:为每家交易所自动加载指定的结算银行。


需求分析:项目中需要适配很多家交易所,而每家交易所都有自己指定的结算银行,或者一家或者多家,那么项目在A交易所运行时,能够自动加载A家交易所指定的结算银行A1、A2,项目在B交易所运行时,能够自动加载B家交易所指定的结算银行B1。


解决方案:1.通过配置文件为项目确定交易所的结算银行

#A
banks=A1,A2
#B
#banks=B1

2.项目加载时,将配置信息加载到manager管理类中
// 加载配置文件
			String path = Manager.class.getClass().getResource("/").getPath() + "conf/bank.properties";
			Properties p = new Properties();
			p.load(new FileInputStream(new File(path)));

			list = new ArrayList<String>();

			String banks = p.getProperty("banks");

			if (banks.indexOf(",") != -1) {
				String[] bankstr = banks.split(",");
				for (String bank : bankstr) {
					list.add(bank.toUpperCase());
				}
			} else {
				list.add(banks.toUpperCase());
			}
3.准备工作做好后,关键的地方来了,了解银行结算的都知道,每日交易所需要向结算银行签到,那么每家银行的签到方式是不一样的,现在我们为A1、A2、B1银行先做好签到方法
public class A1CheckInThread implements Runnable {
	private static Logger logger = Logger.getLogger(A1CheckInThread.class);

	@Override
	public void run() {
		try {
			logger.info("进行A1签到...");
A2、B3的签到方法我就不写了,分别为
A2CheckInThread、<pre name="code" class="java">B1CheckInThread

现在问题来了,如何利用配置信息A1、A2、B3来运行对应的签到方法呢,大家可能第一想到的就是Java的反射机制,利用A1、A2、B1字符串来找到对应的类,进行启动。这个我就不说了,一般情况下,我们的项目都是用到了spring,那么有spring,他为我们提供了更多的选择,spring在启动时,会通过applicationContext.xml中的“<context:component-scan base-package="com.honzh">”元素对有spring注解的类进行自动装配,OK,我们改造一下A1CheckInThread类
@Component
public class A1CheckInThread implements Runnable {
加上该注解后,就表明该类是一个spring组件,然后我们利用一个spring管理类进行bean类的获取工作
public class SpringUtils {
	private static ApplicationContext factory;

	private SpringUtils() {
	};

	public synchronized static ApplicationContext getSpringContext() throws BeansException {
		if (factory == null) {
			factory = new ClassPathXmlApplicationContext("applicationContext.xml");
		}
		return factory;
	}
	
	/**
* @Title: startRunnable
* @Description: 将指定的runnable启动
* @param lastRunnableName
*/
public static void startRunnable(String lastRunnableName) {
for (String bank : getList()) {
logger.info(bank + lastRunnableName + "开始启动");
Runnable runnable = SpringUtils.getRunnableByName(bank + lastRunnableName);
new Thread(runnable).start();
}
}
在项目运行时,我们通过
// spring 初始化
		SpringUtils.getSpringContext();

然后通过指定"A1CheckInThread",方法getRunnableByName就会获取对应的实例化的A1CheckInThread类,如此我们在进行签到的时候,就可以这样
for (String bank : getList()) {
			logger.info(bank + lastRunnableName + "开始启动");
			Runnable runnable = SpringUtils.getRunnableByName(bank + lastRunnableName);
			new Thread(runnable).start();
		}
其中lastRunnableName就是“CheckInThread”。

总结:这个机制经常会用到,但是没有找到方式的话就比较纠结,另外这样即使A交易所有了A3的结算银行,我们只需要在配置文件修改一下,加载好对应A3的签到方法,就OK了。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《Spring核心技术》第6章:深度解析@PropertySource注解
沉淀,成长,突破,帮助他人,成就自我。
35 0
《Spring核心技术》第7章:深度解析@DependsOn注解
沉淀,成长,突破,帮助他人,成就自我。 大家好,我是冰河~~
39 0
烧脑巨作,Spring Boot请求处理(常用参数注解使用)
请求处理-SpringBoot常用参数注解使用 注解: @PathVariable 路径变量 @RequestHeader 获取请求头 @RequestParam 获取请求参数(指问号后的参数,url?a=1&b=2) @CookieValue 获取Cookie值 @RequestAttribute 获取request域属性 @RequestBody 获取请求体[POST] @MatrixVariable 矩阵变量 @ModelAttribute
36 0
10000 字讲清楚 Spring Boot 注解原理 下
10000 字讲清楚 Spring Boot 注解原理 下
31 0
10000 字讲清楚 Spring Boot 注解原理
10000 字讲清楚 Spring Boot 注解原理
36 0
Spring声明式基于注解的缓存(3-精进篇)
目录 一、序言 二、如何自定义过期时间 三、解决方案 1、CacheManger的作用 2、CacheResolver的作用 四、代码示例 1、自定义缓存相关注解 (1) @TTLCacheable注解 (2) @TTLCachePut注解 2、自定义CacheResolver 3、自定义CacheManager 4、开启声明式缓存配置类 五、测试用例 1、 测试服务类 2、 带过期时间的缓存操作 3、 带过期时间的更新操作 六、结语
29 0
Spring声明式基于注解的缓存(2-实践篇)
目录 一、序言 二、使用示例 1、配置 (1) application.properties (2) 基于Redis缓存的CacheManager配置 2、注解运用测试用例 (1) 指定key条件式缓存 (2) 返回值为Optional类型条件式缓存 (3) 不指定key条件式缓存 (4) 指定key删除缓存 (5) 指定key更新缓存 三、结语
22 0
Spring声明式基于注解的缓存(1-理论篇)
目录 一、概述 二、声明式基于注解的缓存 1、@Cacheable注解 (1) 默认缓存key的生成 (2) 声明式自定义key生成 (3) 默认缓存解析 (3) 自定义缓存解析 (4) 条件式缓存 2、@CachePut注解 3、@CacheEvict注解 4、@Caching注解 5、@CacheConfig注解 三、开启声明式缓存注解 四、使用自定义注解
27 0
Spring文件第四课SpringIOC 的三种方案利用注解的方式(二)
Spring文件第四课SpringIOC 的三种方案利用注解的方式(二)
19 0
Spring文件第四课SpringIOC 的三种方案利用注解的方式(一)
Spring文件第四课SpringIOC 的三种方案利用注解的方式(一)
17 0
+关注
沉默王二
微信搜索「沉默王二」,回复关键字「00」获取硬核计算机基础资料。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
电商网站需求分析和架构设计Spring Boot2.6入门
立即下载
云上Docker的Spring Cloud微服务应用实践分享
立即下载
Spring Boot 2.6.0电商网站开发实战
立即下载