zoukankan      html  css  js  c++  java
  • spring注解完成java反射机制

    一直觉得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的话建议去找一些java视频教程来看看。他为我们提供了更多的选择,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;
    }
    
    <span style="white-space:pre">    </span>/** 
    <span style="white-space:pre">    </span>* @Title: getRunnableByName 
    <span style="white-space:pre">    </span>* @Description: 根据runnable类名称获取对应的装配bean.
    <span style="white-space:pre">    </span>* @param runnableName
    <span style="white-space:pre">    </span>* @return
    <span style="white-space:pre">    </span>*/
    <span style="white-space:pre">    </span>public static Runnable getRunnableByName(String runnableName) {
    <span style="white-space:pre">     </span>return factory.getBean(runnableName, Runnable.class);
    <span style="white-space:pre">    </span>}

    在项目运行时,我们通过
    // 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了。

  • 相关阅读:
    Python冒泡算法和修改配置文件
    第五章:处理数据
    第四章:持久存储
    Python之打印99乘法表
    Python之编写登录接口
    Python之文件操作
    第三章:文件与异常
    FineUI 修改config表属性
    FineUI Grid中WindowField根据列数据决定是否Enalble
    表之间不同字段的数据复制
  • 原文地址:https://www.cnblogs.com/plan123/p/4171798.html
Copyright © 2011-2022 走看看