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

Spring中的spring.factories文件用法(Spring如何加載第三方Bean)

 更新時間:2021年10月08日 08:57:40   作者:程序猿新手_曹先生  
這篇文章主要介紹了Spring中的spring.factories文件用法(Spring如何加載第三方Bean),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Spring的spring.factories文件用法

在springBoot中,它自動掃描包的時候,只會掃描自己模塊下的類。

問題

如果我們不想被Spring容器管理的Bean的路徑下不再SpringBoot的包掃描路徑下,怎么辦呢?如何加載別的第三方Bean呢?

解決

首先我們創(chuàng)建一個工程,另外創(chuàng)建一個與啟動類不在一個級別的目錄。

第一種方法就是使用在啟動類上加上@Import注解。

@Import(value = {Test.class})

第二種方法就是創(chuàng)建spring.factories文件

現(xiàn)在我們將其改造一下,采用spring.factories的方式去加載Test類,在resources目錄下新建一個META-INF的目錄,然后再新建一個spring.factories文件,文件內(nèi)容為:

下面第二條就是我們自己的類的路徑。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=/
com.huawei.it.config.Test

然后在springBoot中的啟動類中將@Import注釋掉,啟動一下,在控制臺上就會發(fā)現(xiàn),我們自己的配置類已經(jīng)加載到Spring容器中去了,所以Spring可以加載一個工程下的任意一下工程類了。

應(yīng)用

下面就是我在Nacos源碼中看到的,可以看到spring.factories文件中內(nèi)容,與我們自己類加載到Spring容器中是一樣的道理。

SpringBoot的擴(kuò)展機(jī)制之Spring Factories

寫在前面:Spring Boot中有一種非常解耦的擴(kuò)展機(jī)制:Spring Factories。這種擴(kuò)展機(jī)制實際上是仿照J(rèn)ava中的SPI擴(kuò)展機(jī)制來實現(xiàn)的。

什么是 SPI機(jī)制

SPI的全名為Service Provider Interface.大多數(shù)開發(fā)人員可能不熟悉,因為這個是針對廠商或者插件的。在java.util.ServiceLoader的文檔里有比較詳細(xì)的介紹。

簡單的總結(jié)下java SPI機(jī)制的思想。我們系統(tǒng)里抽象的各個模塊,往往有很多不同的實現(xiàn)方案,比如日志模塊的方案,xml解析模塊、jdbc模塊的方案等。面向的對象的設(shè)計里,我們一般推薦模塊之間基于接口編程,模塊之間不對實現(xiàn)類進(jìn)行硬編碼。一旦代碼里涉及具體的實現(xiàn)類,就違反了可拔插的原則,如果需要替換一種實現(xiàn),就需要修改代碼。為了實現(xiàn)在模塊裝配的時候能不在程序里動態(tài)指明,這就需要一種服務(wù)發(fā)現(xiàn)機(jī)制。

java SPI就是提供這樣的一個機(jī)制:為某個接口尋找服務(wù)實現(xiàn)的機(jī)制。有點類似IOC的思想,就是將裝配的控制權(quán)移到程序之外,在模塊化設(shè)計中這個機(jī)制尤其重要。

Spring Boot中的SPI機(jī)制

在Spring中也有一種類似與Java SPI的加載機(jī)制。它在META-INF/spring.factories文件中配置接口的實現(xiàn)類名稱,然后在程序中讀取這些配置文件并實例化。

這種自定義的SPI機(jī)制是Spring Boot Starter實現(xiàn)的基礎(chǔ)。

這里寫圖片描述

Spring Factories實現(xiàn)原理是什么

spring-core包里定義了SpringFactoriesLoader類,這個類實現(xiàn)了檢索META-INF/spring.factories文件,并獲取指定接口的配置的功能。在這個類中定義了兩個對外的方法:

loadFactories 根據(jù)接口類獲取其實現(xiàn)類的實例,這個方法返回的是對象列表。

loadFactoryNames 根據(jù)接口獲取其接口類的名稱,這個方法返回的是類名的列表。

上面的兩個方法的關(guān)鍵都是從指定的ClassLoader中獲取spring.factories文件,并解析得到類名列表,具體代碼如下↓

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
    String factoryClassName = factoryClass.getName();
    try {
        Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
                ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
        List<String> result = new ArrayList<String>();
        while (urls.hasMoreElements()) {
            URL url = urls.nextElement();
            Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
            String factoryClassNames = properties.getProperty(factoryClassName);
            result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
        }
        return result;
    }
    catch (IOException ex) {
        throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
                "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
    }
}

從代碼中我們可以知道,在這個方法中會遍歷整個ClassLoader中所有jar包下的spring.factories文件。也就是說我們可以在自己的jar中配置spring.factories文件,不會影響到其它地方的配置,也不會被別人的配置覆蓋。

spring.factories的是通過Properties解析得到的,所以我們在寫文件中的內(nèi)容都是安裝下面這種方式配置的:

com.xxx.interface=com.xxx.classname

如果一個接口希望配置多個實現(xiàn)類,可以使用','進(jìn)行分割。

Spring Factories在Spring Boot中的應(yīng)用

在Spring Boot的很多包中都能夠找到spring.factories文件,接下來我們以spring-boot包為例進(jìn)行介紹

在日常工作中,我們可能需要實現(xiàn)一些SDK或者Spring Boot Starter給被人使用時, 我們就可以使用Factories機(jī)制。Factories機(jī)制可以讓SDK或者Starter的使用只需要很少或者不需要進(jìn)行配置,只需要在服務(wù)中引入我們的jar包即可。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決Java字符串JSON轉(zhuǎn)換異常:cn.hutool.json.JSONException:?Mismatched?hr?and?body

    解決Java字符串JSON轉(zhuǎn)換異常:cn.hutool.json.JSONException:?Mismatched?

    這篇文章主要給大家介紹了關(guān)于如何解決Java字符串JSON轉(zhuǎn)換異常:cn.hutool.json.JSONException:?Mismatched?hr?and?body的相關(guān)資料,文中將解決的辦法通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • java對象轉(zhuǎn)換String類型的三種方法

    java對象轉(zhuǎn)換String類型的三種方法

    在很多情況下我們都需要將一個對象轉(zhuǎn)換為String類型。一般來說有三種方法可以實現(xiàn):Object.toString()、(String)Object、String.valueOf(Object)。下面對這三種方法一一分析
    2013-11-11
  • Java實現(xiàn)高并發(fā)秒殺的幾種方式

    Java實現(xiàn)高并發(fā)秒殺的幾種方式

    高并發(fā)場景在現(xiàn)場的日常工作中很常見,本文主要介紹了Java實現(xiàn)高并發(fā)秒殺的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • java調(diào)用webservice接口,并解析返回參數(shù)問題

    java調(diào)用webservice接口,并解析返回參數(shù)問題

    這篇文章主要介紹了java調(diào)用webservice接口,并解析返回參數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java?垃圾回收超詳細(xì)講解記憶集和卡表

    Java?垃圾回收超詳細(xì)講解記憶集和卡表

    卡表就是記憶集的一種具體實現(xiàn),它定義了記憶集的記錄精度、與堆內(nèi)存的映射關(guān)系等。?關(guān)于卡表與記憶集的關(guān)系,不妨按照J(rèn)ava語言中HashMap與Map的關(guān)系來類比理解。記憶集是一種用于記錄從非收集區(qū)域指向收集區(qū)域的指針集合的抽象數(shù)據(jù)結(jié)構(gòu)
    2022-04-04
  • ResponseBodyAdvice的使用原理源碼解析

    ResponseBodyAdvice的使用原理源碼解析

    這篇文章主要為大家介紹了ResponseBodyAdvice的使用原理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 在spring中手寫全局異常攔截器

    在spring中手寫全局異常攔截器

    這篇文章主要介紹了如何在spring中手寫全局異常攔截器,幫助大家更好的理解和使用spring框架,感興趣的朋友可以了解下
    2020-11-11
  • 簡單聊一聊Java線程池ThreadPoolExecutor

    簡單聊一聊Java線程池ThreadPoolExecutor

    在使用線程池之后,開啟線程就變成了在線程池當(dāng)中找到一個空閑的線程,銷毀線程變成了歸還線程到線程池的過程,下面這篇文章主要給大家介紹了關(guān)于Java線程池ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Spring MVC處理方法返回值過程解析

    Spring MVC處理方法返回值過程解析

    這篇文章主要介紹了Spring MVC處理方法返回值過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • java中如何實現(xiàn) zip rar 7z 壓縮包解壓

    java中如何實現(xiàn) zip rar 7z 壓縮包解壓

    這篇文章主要介紹了java中如何實現(xiàn) zip rar 7z 壓縮包解壓問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論