前言:一直觉得spring提供的注解装配bean机制非常的好,尤其是在做类似Java反射机制的时候太方便了,下面就依据项目需求进行一次记录,方便以后使用。
需求一句话:为每家交易所自动加载指定的结算银行。
需求分析:项目中需要适配很多家交易所,而每家交易所都有自己指定的结算银行,或者一家或者多家,那么项目在A交易所运行时,能够自动加载A家交易所指定的结算银行A1、A2,项目在B交易所运行时,能够自动加载B家交易所指定的结算银行B1。
解决方案:1.通过配置文件为项目确定交易所的结算银行
#A banks=A1,A2 #B #banks=B1
// 加载配置文件 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
@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();
for (String bank : getList()) { logger.info(bank + lastRunnableName + "开始启动"); Runnable runnable = SpringUtils.getRunnableByName(bank + lastRunnableName); new Thread(runnable).start(); }其中lastRunnableName就是“CheckInThread”。
总结:这个机制经常会用到,但是没有找到方式的话就比较纠结,另外这样即使A交易所有了A3的结算银行,我们只需要在配置文件修改一下,加载好对应A3的签到方法,就OK了。