背景
Java 中區分 Api 和 Spi,通俗的講:Api 和 Spi 都是相對的概念,他們的差別只在語義上,Api 直接被應用開發人員使用,Spi 被框架擴張人員使用,詳細內容可以看:http://www.cnblogs.com/happyframework/p/3325560.html。
Java類庫中的實例
代碼
1 Class.forName("com.mysql.jdbc.Driver"); 2 Connection conn = DriverManager.getConnection( 3 "jdbc:mysql://localhost:3306/test", "root", "123456"); 4 Statement stmt = conn.createStatement(); 5 6 ResultSet rs = stmt.executeQuery("select * from Users");
說明
java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 實現,其它的都是 Api。
如何實現這種結構?
代碼
1 public class Program { 2 3 public static void main(String[] args) throws InstantiationException, 4 IllegalAccessException, ClassNotFoundException { 5 Class.forName("SpiA"); 6 7 Api api = new Api("a"); 8 api.Send("段光偉"); 9 } 10 }
1 import java.util.*; 2 3 public class Api { 4 private static HashMap<String, Class<? extends Spi>> spis = new HashMap<String, Class<? extends Spi>>(); 5 private String protocol; 6 7 public Api(String protocol) { 8 this.protocol = protocol; 9 } 10 11 public void Send(String msg) throws InstantiationException, 12 IllegalAccessException { 13 Spi spi = spis.get(protocol).newInstance(); 14 15 spi.send("消息發送開始"); 16 spi.send(msg); 17 spi.send("消息發送結束"); 18 } 19 20 public static void Register(String protocol, Class<? extends Spi> cls) { 21 spis.put(protocol, cls); 22 } 23 }
1 public interface Spi { 2 void send(String msg); 3 }
1 public class SpiA implements Spi { 2 static { 3 Api.Register("a", SpiA.class); 4 } 5 6 @Override 7 public void send(String msg) { 8 System.out.println("SpiA:" + msg); 9 } 10 11 }
說明
Spi 實現的加載可以使用很多種方式,文中是最基本的方式。
備注
還記得大學期間學習 Java,當時看到 Spi 的開發方式就感覺一個詞:不明覺厲。
時間流逝,經驗增加,財富增加,幸福也會增加。