Spring獲取實現某接口的所有實例bean

1、獲取 applicationContext,通過ApplicationAware自動注入

2、getBeansOfType、getBeanNamesForType

//key位 beanName,value爲bean
Map<String, Interface> result = applicationContext().getBeansOfType(Interface.class);

//返回 beanName 的String 數組
String[] result = applicationContext().getBeanNamesForType(Interface.class);

注:這種方法除了可以獲取實現【接口】的所有Bean,也可以獲取所有繼承【抽象類/類】的所有Bean,如下

Map<String, AbstractObject> result = applicationContext().getBeansOfType(AbstractObject.class);

 

String[] result1 = SpringContextUtils.getApplicationContext().getBeanNamesForType(Action.class);
Map<String, Action> result2 = SpringContextUtils.getApplicationContext().getBeansOfType(Action.class);
logger.info(Arrays.toString(result1));
logger.info(result2.toString());
2021-01-14 01:01:51.733 INFO [http-nio-8080-exec-1]com.imddysc.study.sqlmonitor.controller.TestController.test01:28 -[emailAction, logAction, msgAction, msxfAction, noAction, wechatAction]
2021-01-14 01:01:51.733 INFO [http-nio-8080-exec-1]com.imddysc.study.sqlmonitor.controller.TestController.test01:29 -{emailAction=com.imddysc.study.sqlmonitor.action.EmailAction@6608db67, logAction=com.imddysc.study.sqlmonitor.action.LogAction@7e7a8006, msgAction=com.imddysc.study.sqlmonitor.action.MsgAction@1e67cafc, msxfAction=com.imddysc.study.sqlmonitor.action.MsxfAction@2fd03079, noAction=com.imddysc.study.sqlmonitor.action.NoAction@fa30507, wechatAction=com.imddysc.study.sqlmonitor.action.WechatAction@2573de45}

 

根據不同參數,調用不同Service完成不同功能的案例

		String str = "msg";
		Action action = null;
		if("msg".equals(str)) {
			action = (Action) SpringContextUtils.getBean("msgAction");
		}else if ("wechat".equals(str)) {
			action = (Action) SpringContextUtils.getBean("wechatAction");
		}else if ("email".equals(str)) {
			action = (Action) SpringContextUtils.getBean("emailAction");
		}
		action.doAction();
		return "1";

 

補充:java通過Class的isAssignableFrom方法

  註釋:【a.isAssignableFrom(b)】有兩個Class類型的類象,一個是調用isAssignableFrom方法的類對象(對象a),以及方法中作爲參數的這個類對象(對象b),這兩個對象如果滿足以下條件則返回true,否則返回false:

    a對象所對應類信息是b對象所對應的類信息的父類或者是父接口,簡單理解即a是b的父類或接口

    a對象所對應類信息與b對象所對應的類信息相同,簡單理解即a和b爲同一個類或同一個接口

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章