Java利用spring注解做反射机制

简介: Java利用spring注解做反射机制

前言:一直觉得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了。

相关文章
|
10月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
1121 3
|
10月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
856 0
|
10月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
1500 128
|
11月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
10月前
|
Java 测试技术 API
将 Spring 的 @Embedded 和 @Embeddable 注解与 JPA 结合使用的指南
Spring的@Embedded和@Embeddable注解简化了JPA中复杂对象的管理,允许将对象直接嵌入实体,减少冗余表与连接操作,提升数据库设计效率。本文详解其用法、优势及适用场景。
480 126
|
12月前
|
人工智能 缓存 安全
Java中的反射机制:深入探索与应用
Java反射机制是程序运行时动态获取类信息并操作类成员的特性,具备高度灵活性,但也伴随性能与安全风险。本文详解反射的基本用法、高级应用及最佳实践,助你掌握这一强大工具的正确使用方式。
243 0
|
9月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
9月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
790 8
|
10月前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
1091 1
使用Spring的@Retryable注解进行自动重试