欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?SpringBoot?獲取接口實現(xiàn)類匯總

 更新時間:2022年09月01日 15:37:12   作者:Charge8  
這篇文章主要介紹了Java?SpringBoot?獲取接口實現(xiàn)類匯總,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

前言

有時候,根據(jù)業(yè)務(wù)邏輯的需求,需要獲取到某個接口的所有實現(xiàn)類,然后根據(jù)業(yè)務(wù)類型來執(zhí)行不同的實現(xiàn)類方法。有點類似策略模式。

  • 如果沒有用到 Spring的話,可以使用 ServiceLoaderl類JDK自帶的一個類加載器(其他框架的SPI機制也是可以實現(xiàn))。
ServiceLoader<MyInterface> loader = ServiceLoader.load(接口名.class);

如果接口的所有實現(xiàn)類均被 Spring托管了。那么我們可以從Spring的IOC容器中可以很簡單的獲取這些實現(xiàn)類。

以上兩種方式,實現(xiàn)的功能都是一樣的,實現(xiàn)方式不同,底層用的技術(shù)一樣的,都是反射。

下面我們基于 Spring管理的 bean中來獲取接口的所有實現(xiàn)類。

可以直接使用 Spring的 @Autowired注解。也可以使用 ApplicationContextAware接口來獲取并管理所有實現(xiàn)類。

一、獲取接口的所有實現(xiàn)類

1、枚舉

這個枚舉根據(jù)業(yè)務(wù)自行創(chuàng)建,可有可無。

public enum XxxTypeEnum {
    XXX_1("code1", "xxx1業(yè)務(wù)"),
    XXX_2("code2", "xxx2業(yè)務(wù)"),
    ;
    private String code;
    private String desc;
    XxxTypeEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }

}

2、業(yè)務(wù)接口

public interface IXxxService {

    /**
     *是否支持
     * @param xxxTypeEnum
     * @return
     */
    boolean isSupport(XxxTypeEnum xxxTypeEnum);

    /**
     * 拼接字符串業(yè)務(wù)方法
     *
     * @param a
     * @param b
     * @return
     */
    String spliceStr(String a, String b);
}

2.1 實現(xiàn)類

1)Xxx001ServiceImpl

@Service
public class Xxx001ServiceImpl implements IXxxService {
    @Override
    public boolean isSupport(XxxTypeEnum xxxTypeEnum) {
        return XxxTypeEnum.XXX_1.equals(xxxTypeEnum);
    }
    @Override
    public String spliceStr(String a, String b) {
        return a + "--Xxx001ServiceImpl--" + "b";
    }
}

2)Xxx002ServiceImpl

@Service
public class Xxx002ServiceImpl implements IXxxService {
    @Override
    public boolean isSupport(XxxTypeEnum xxxTypeEnum) {
        return XxxTypeEnum.XXX_2.equals(xxxTypeEnum);
    }
    @Override
    public String spliceStr(String a, String b) {
        return a + "--Xxx002ServiceImpl--" + "b";
    }

}

3、ApplicationContextAware接口實現(xiàn)類

獲取到所有實現(xiàn)類,然后根據(jù)業(yè)務(wù)管理所有實現(xiàn)類。

@Component
public class XxxServiceLocator implements ApplicationContextAware {
	/**
	 * 存儲 IXxxService接口的所有實現(xiàn)類
	 */
	private Map<String, IXxxService> xxxServiceMap;
	private List<IXxxService> xxxServiceList;
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		// 通過上下文,根據(jù)接口類型返回相應(yīng)的所有實現(xiàn)類bean
		xxxServiceMap = applicationContext.getBeansOfType(IXxxService.class);
		xxxServiceList = new ArrayList<>(xxxServiceMap.values());
	}
	/**
	 * 獲取所有實現(xiàn)類
	 *
	 * @return
	 */
	public Map<String, IXxxService> getAllMap() {
		return xxxServiceMap;
	}

	/**
	 * 通過名稱獲取某個實現(xiàn)類
	 *
	 * @param beanName
	 *            bean名字
	 * @return
	 */
	private IXxxService getByName(String beanName) {
		return xxxServiceMap.get(beanName);
	}

	/**
	 * 獲取所有實現(xiàn)類
	 *
	 * @return
	 */
	public List<IXxxService> getAllList() {
		return xxxServiceList;
	}

	/**
	 * 根據(jù)枚舉獲取某個實現(xiàn)類
	 *
	 * @param xxxTypeEnum
	 * @return
	 */
	public IXxxService get(XxxTypeEnum xxxTypeEnum) {
		IXxxService xxxService = xxxServiceList.stream().filter(s -> s.isSupport(xxxTypeEnum))
				.collect(Collectors.toList()).get(0);
		return xxxService;
	}

}

4、獲取到所有實現(xiàn)類使用

@RestController
@RequestMapping(value = "/xxx")
public class XxxController {
    /**
     * 方式1:直接使用spring依賴注入注解
     */
    @Autowired
    private Map<String, IXxxService> xxxServiceMap;

    /**
     * 方式2:直接使用spring的依賴注入注解
     */
    @Autowired
    private List<IXxxService> xxxServiceList;

    /**
     * 方式3:借助spring的ApplicationContextAware
     */
    @Autowired
    private XxxServiceLocator xxxServiceLocator;

    /**
     * 獲取到所有實現(xiàn)類使用
     *
     */
    @RequestMapping(value = "/getAll", method = RequestMethod.GET)
    public void getAll() {
        String a = "asasa";
        String b = "bnbnb";
        Map<String, IXxxService> allMap = xxxServiceLocator.getAllMap();
        List<IXxxService> allList = xxxServiceLocator.getAllList();

        System.out.println("allMap              --->" + allMap);
        System.out.println("xxxServiceMap       --->" + xxxServiceMap);
        System.out.println("allList             --->" + allList);
        System.out.println("xxxServiceList      --->" + xxxServiceList);
        for (IXxxService iXxxService : xxxServiceList) {
            System.out.println("xxxServiceList執(zhí)行結(jié)果  ---> " + iXxxService.spliceStr(a, b));
        }
        IXxxService iXxxService = xxxServiceLocator.get(XxxTypeEnum.XXX_1);
        System.out.println("XxxEnum.XXX_1執(zhí)行結(jié)果  ---> " + iXxxService.spliceStr(a, b));
        iXxxService = xxxServiceLocator.get(XxxTypeEnum.XXX_2);
        System.out.println("XxxEnum.XXX_2執(zhí)行結(jié)果  ---> " + iXxxService.spliceStr(a, b));

    }
}

到此這篇關(guān)于Java SpringBoot 獲取接口實現(xiàn)類匯總的文章就介紹到這了,更多相關(guān)Java SpringBoot 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于java servlet過濾器和監(jiān)聽器(詳解)

    基于java servlet過濾器和監(jiān)聽器(詳解)

    下面小編就為大家?guī)硪黄趈ava servlet過濾器和監(jiān)聽器(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • IDEA創(chuàng)建Java項目保姆級教程(超詳細(xì)!)

    IDEA創(chuàng)建Java項目保姆級教程(超詳細(xì)!)

    這篇文章主要給大家介紹了關(guān)于IDEA創(chuàng)建Java項目保姆級教程的相關(guān)資料,Java是一種廣泛使用的編程語言,廣泛用于Web應(yīng)用程序和客戶端應(yīng)用程序的開發(fā),文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • SpringBoot詳解如何實現(xiàn)讀寫分離

    SpringBoot詳解如何實現(xiàn)讀寫分離

    當(dāng)響應(yīng)的瓶頸在數(shù)據(jù)庫的時候,就要考慮數(shù)據(jù)庫的讀寫分離,當(dāng)然還可以分庫分表,那是單表數(shù)據(jù)量特別大,當(dāng)單表數(shù)據(jù)量不是特別大,但是請求量比較大的時候,就要考慮讀寫分離了.具體的話,還是要看自己的業(yè)務(wù)...如果還是很慢,那就要分庫分表了...我們這篇就簡單講一下讀寫分離
    2022-05-05
  • Java?Main?函數(shù)啟動不退出的解決方案

    Java?Main?函數(shù)啟動不退出的解決方案

    這篇文章主要介紹了Java?Main?函數(shù)啟動不退出的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • java反射耗時測試案例解析

    java反射耗時測試案例解析

    這篇文章主要介紹了java反射耗時測試案例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • 淺談Java中格式化輸出

    淺談Java中格式化輸出

    這篇文章主要介紹了Java中格式化輸出,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳解Kotlin 高階函數(shù) 與 Lambda 表達(dá)式

    詳解Kotlin 高階函數(shù) 與 Lambda 表達(dá)式

    這篇文章主要介紹了詳解Kotlin 高階函數(shù) 與 Lambda 表達(dá)式的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • JAVA Iterator 轉(zhuǎn)成 List 的操作

    JAVA Iterator 轉(zhuǎn)成 List 的操作

    這篇文章主要介紹了JAVA Iterator 轉(zhuǎn)成 List 的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • java操作(DOM、SAX、JDOM、DOM4J)xml方式的四種比較與詳解

    java操作(DOM、SAX、JDOM、DOM4J)xml方式的四種比較與詳解

    java中四種操作(DOM、SAX、JDOM、DOM4J)xml方式的比較與詳解
    2008-10-10
  • @Value如何設(shè)置默認(rèn)值

    @Value如何設(shè)置默認(rèn)值

    這篇文章主要介紹了@Value如何設(shè)置默認(rèn)值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論