SPI的全名為Service Provider Interface,是Java實現(xiàn)面向接口的解耦機制。通過SPI,模塊之間通過接口約定,而非具體的實現(xiàn),從而使得各種不同的實現(xiàn)方案能夠可插拔。
Java里面很多公共模塊都采用SPI機制,比如日志、JDBC等等。
SPI約定
當服務的提供者,提供了服務接口的一種實現(xiàn)之后,在jar包的META-INF/services/目錄里同時創(chuàng)建一個以服務接口命名的文件。該文件里就是實現(xiàn)該服務接口的具體實現(xiàn)類。而當外部程序裝配這個模塊的時候,就能通過該jar包META-INF/services/里的配置文件找到具體的實現(xiàn)類名,并裝載實例化,完成模塊的注入。
基于這樣一個約定就能很好的找到服務接口的實現(xiàn)類,而不需要再代碼里制定。
jdk提供服務實現(xiàn)查找的一個工具類:java.util.ServiceLoader