Java利用spring註解做反射機制

沉默王二發表於2014-12-18
版權宣告:歡迎轉載,請註明沉默王二原創。 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了。


相關文章