淺談Java的SPI技術
人狠話不多,先上截圖和代碼吧。
這是工程目錄??吹絩esources目錄下面沒有,添加了META-INF和services目錄。
添加了一個com.gys.test.IAnimal文件。這個文件名和上面的接口名完全對應。這個目錄的文件名是有講究的,按照SPI規范來的。
上代碼:
package com.gys.test;public interface IAnimal { void eat();}
package com.gys.test.impl;import com.gys.test.IAnimal;public class Bird implements IAnimal { @Override public void eat() { System.out.println('小鳥吃蟲子'); }}
package com.gys.test.impl;import com.gys.test.IAnimal;public class Dog implements IAnimal { @Override public void eat() { //System.out.println('小狗吃屎'); System.out.println('小狗吃骨頭'); }}
package com.gys.test;import java.util.ServiceLoader;public class MainTest { public static void main(String[] args) { ServiceLoader<IAnimal> animals=ServiceLoader.load(IAnimal.class); for (IAnimal animal:animals){ animal.eat(); } }}
源碼一角說明META-INF/service:
ServiceLoader.load(clsss)就是去ClassPath的MEAT-INF的service下去尋找指定文件;這里的classPath包括外部引入的jar包中的classPath.
如果我們引入了第三方的jar包,如果jar中的META-INF/service有com.gys.test.IAnimal文件,也會被讀取,并且實例化里面的類。
SPI使用場景:
自己提供接口讓別人提供實現的方式;典型的如JDBC模式。
以上就是淺談Java的SPI技術的詳細內容,更多關于JAVA SPI技術的資料請關注好吧啦網其它相關文章!
相關文章: