人狠話不多,先上截圖和代碼吧。
這是工程目錄??吹絩esources目錄下面沒有,添加了META-INF和services目錄。
添加了一個com.gys.test.IAnimal文件。這個文件名和上面的接口名完全對應。這個目錄的文件名是有講究的,按照SPI規范來的。
上代碼:
1
2
3
4
5
|
package com.gys.test; public interface IAnimal { void eat(); } |
1
2
3
4
5
6
7
8
9
10
11
|
package com.gys.test.impl; import com.gys.test.IAnimal; public class Bird implements IAnimal { @Override public void eat() { System.out.println( "小鳥吃蟲子" ); } } |
1
2
3
4
5
6
7
8
9
10
11
|
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( "小狗吃骨頭" ); } } |
1
2
3
4
5
6
7
8
9
10
11
12
|
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技術的資料請關注服務器之家其它相關文章!
原文鏈接:https://www.cnblogs.com/guoyansi19900907/p/12765353.html