Java ServiceLoader與Spring工廠載入器
控制反轉IOC不僅可以在類級別進行,而且可以在模組級別進行,雖然OSGi技術已經存世了很長時間了,但是,在Java中也可以像在Spring中一般都可以直接使用IoC方法來實現類似OSGI方式。
Java Service Loader
這是來自JDK的開箱即用的Java API,它提供了一種特定方式的控制反轉IOC,由Service Loader類實現。它用來定位類路徑上的某個介面的實現類。這種方式能夠讓我們在Java執行時動態發現類路徑classpath上指定介面的某個實現,動態工廠載入模式,這樣就分離了API模組和它的多個具體實現模組類,也就是說,同一套API介面,我們後面可以給予它不同的實現方式,這種介面和實現的清晰分離一直是Java生態最強的優勢。
日誌框架SLF4J就選擇了這條路徑。SLF4J本身就是API,但可以使用不同的實現(如Logback,Log4J等),SLF4J客戶端僅與SLF4J API這個抽象介面模組互動,而放置在類路徑上的不同的實現模組在執行時能夠以不同方式處理細節。
Service Loader有一個約束,需要Jar包裡存在一個目錄META-INF/services目錄,在這個目錄裡有一個檔案,檔案的名稱完全是介面的完整路徑名稱,而其內容則是指定介面的實現類完整路徑名稱。例如,對於介面com.Foo,必須有一個名為META-INF/services/com.Foo檔案,檔案內容如下所示的檔案:
com.FooImpl1
com.FooImpl2
上面的類都必須實現com.Foo介面。
從程式碼的角度來看,它非常簡單:
ServiceLoader<Foo> loader = ServiceLoader.load(Foo.class); loader.iterator(); <p class="indent"> |
上面程式碼獲得loader是一個集合類,需要遍歷一次。
Service Loader與Spring整合
我們可以透過工廠bean將上面ServiceLoader與Spring整合,例如以下程式碼:
@Configuration public class ServiceConfiguration { @Bean public ServiceListFactoryBean serviceListFactoryBean() { ServiceListFactoryBean serviceListFactoryBean = new ServiceListFactoryBean(); serviceListFactoryBean.setServiceType(Foo.class); return serviceListFactoryBean; } } Object object = serviceListFactoryBean.getObject(); <p class="indent"> |
顯然,這需要進一步的操作才能以正確的形式獲取資料(提示:它是一個連結串列)。
Spring Factories Loader
與Java Service Loader一樣,Spring提供了另一個反轉控制的實現,但是隻涉及一個屬性檔案,它必須被命名spring.factories並位於Jar其下META-INF目錄下。從程式碼的角度來看,該檔案是透過SpringFactoriesLoader.loadFactories() 這個靜態方法讀取的- 是的,對於Spring來說,它非常強悍。
客戶端程式碼無法更簡單:
List<Foo> foos = SpringFactoriesLoader.loadFactories(Foo.class, null); <p class="indent"> |
注意第二個引數是可選的類載入器。
與Java Service Loader相比,差異有兩方面:
1. 一種檔案格式是否比其他檔案格式更好?更可讀或更易於維護,這也許是個人品味的問題。
2. spring.factories的關鍵是不需要介面,也不需要實現子類來實現它。Spring Boot就是使用這種方法來處理自動配置bean:關鍵就只是一個註釋,即 org.springframework.boot.autoconfigure.EnableAutoConfiguration,值是在類上面的註解@Configuration中寫明的,這能夠有更靈活的設計。
以上完整程式碼:github
相關文章
- Spring Cloud Gateway ---GatewayFilter過濾器、過濾器工廠(入門)SpringCloudGatewayFilter過濾器
- JAVA-反射與工廠模式Java反射模式
- 【Java】ServiceLoader原始碼分析Java原始碼
- Java | Spring框架學習筆記--(1)工廠JavaSpring框架筆記
- Java 設計模式之工廠方法模式與抽象工廠模式Java設計模式抽象
- JAVA設計模式 3【建立型】理解工廠模式與抽象工廠模式Java設計模式抽象
- Java設計模式學習筆記——工廠模式與抽象工廠模式Java設計模式筆記抽象
- java 工廠模式Java模式
- Spring筆記(1) - 工廠Spring筆記
- Java - 反射機制與工廠設計模式Java反射設計模式
- java 抽象工廠模式Java抽象模式
- spring bean定義與載入方式SpringBean
- Spring Cloud Gateway中的過濾器工廠:重試過濾器SpringCloudGateway過濾器
- Spring Cloud Gateway WebFilter工廠 | BaeldungSpringCloudGatewayWebFilter
- Java類載入器詳解Java
- Java-JVM-類載入器JavaJVM
- Java的類載入器與雙親委託機制Java
- Java基礎-類載入器以及載入機制Java
- Java&Android開發-淺析ServiceLoader類JavaAndroid
- java工廠模式訓練Java模式
- Java抽象工廠模式案例Java抽象模式
- Java實現工廠模式Java模式
- 【Java】簡單工廠模式、工廠模式、介面卡模式Java模式
- 工廠模式講解, 引入Spring IOC模式Spring
- 12、spring工廠+web前臺搭建SpringWeb
- 【智慧工廠】智慧工廠整體規劃與實施
- 原始碼解析Spring AOP的載入與生效原始碼Spring
- 熱修復與外掛化基礎——Java與Android的類載入器JavaAndroid
- Java 設計模式(工廠模式)Java設計模式
- Java基礎-抽象工廠模式Java抽象模式
- Java基礎-工廠方法模式Java模式
- java設計模式 – 工廠模式Java設計模式
- Java設計模式(工廠模式)Java設計模式
- Java設計模式-工廠模式Java設計模式
- Java設計模式--工廠模式Java設計模式
- Spring:工廠模式哪裡解耦了?Spring模式解耦
- java虛擬機器規範-載入、連結與初始化Java虛擬機
- 關於java中的類載入器Java