国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring中的spring.factories文件用法(Spring如何加載第三方Bean)

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

2022-02-10 14:51程序猿新手_曹先生 Java教程

這篇文章主要介紹了Spring中的spring.factories文件用法(Spring如何加載第三方Bean),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

 

Spring的spring.factories文件用法

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

 

問題

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

 

解決

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

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

@Import(value = {Test.class})

第二種方法就是創建spring.factories文件

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

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

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

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

應用

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

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

 

SpringBoot的擴展機制之Spring Factories

寫在前面:Spring Boot中有一種非常解耦的擴展機制:Spring Factories。這種擴展機制實際上是仿照Java中的SPI擴展機制來實現的。

 

什么是 SPI機制

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

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

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

 

Spring Boot中的SPI機制

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

這種自定義的SPI機制是Spring Boot Starter實現的基礎。

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

 

Spring Factories實現原理是什么

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

loadFactories 根據接口類獲取其實現類的實例,這個方法返回的是對象列表。

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

上面的兩個方法的關鍵都是從指定的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解析得到的,所以我們在寫文件中的內容都是安裝下面這種方式配置的:

com.xxx.interface=com.xxx.classname

如果一個接口希望配置多個實現類,可以使用","進行分割。

 

Spring Factories在Spring Boot中的應用

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

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

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_41691210/article/details/110676863

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
主站蜘蛛池模板: 在线一区| 一区二区三区在线 | a欧美 | 91久久国产综合久久 | 精品久久久久久久人人人人传媒 | 国产片在线看 | 欧美一级片在线观看 | 欧美大片免费观看 | 91视频 - 88av| 特黄特色一级片 | 久久com| 免费国产一区 | 天天干天天看天天操 | 91精品国产手机 | 国产精品一级 | 久久亚洲国产精品 | 午夜剧 | 亚洲国产成人精品久久久国产成人一区 | 国产精品久久久久久久久久久久久 | 欧美成人免费在线视频 | 精品国产一区二区三区久久久蜜 | 欧美一区二区三区在线观看视频 | 日韩免费一区 | 国产 欧美 日产久久 | 美女超碰 | 亚洲精品久久久久久动漫 | 国产综合区 | 色综合视频在线观看 | 深夜在线 | 国产精品亚洲一区二区三区在线 | 久久久人成影片免费观看 | 日本免费在线 | av网站观看| 国产一区二区三区四区hd | 国产在线视频网站 | 在线国产一区二区 | 欧美日韩视频一区二区 | 91精品国产综合久久久久久 | 国外精品久久久蜜桃免费全文阅读 | 国产美女在线播放 | 亚洲综合久久久 |