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了。


相关文章
|
1天前
|
Java 编译器 开发者
Java一分钟之-Java注解的理解与应用
【5月更文挑战第12天】本文介绍了Java注解的基础知识和常见应用,包括定义、应用和解析注解。注解在编译检查、框架集成和代码生成等方面发挥重要作用。文章讨论了两个易错点:混淆保留策略和注解参数类型限制,并提供了避免策略。提醒开发者避免过度使用注解,以保持代码清晰。理解并恰当使用注解能提升代码质量。
11 3
|
1天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
15 4
|
2天前
|
移动开发 前端开发 NoSQL
ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)
ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)
12 0
|
2天前
|
Java API Python
|
3天前
|
JSON 前端开发 Java
【JAVA进阶篇教学】第七篇:Spring中常用注解
【JAVA进阶篇教学】第七篇:Spring中常用注解
|
3天前
|
XML Java 数据库连接
【JAVA基础篇教学】第十五篇:Java中Spring详解说明
【JAVA基础篇教学】第十五篇:Java中Spring详解说明
|
4天前
|
Java 数据安全/隐私保护
java中异常处理机制
java中异常处理机制
11 1
|
4天前
|
算法 安全 Java
深入探索Java中的并发编程:CAS机制的原理与应用
总之,CAS机制是一种用于并发编程的原子操作,它通过比较内存中的值和预期值来实现多线程下的数据同步和互斥,从而提供了高效的并发控制。它在Java中被广泛应用于实现线程安全的数据结构和算法。
19 0
|
5天前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
11 0
|
5天前
|
Java API 开发者
解密Java反射机制与动态代理
解密Java反射机制与动态代理
10 0