Java:Spi 小实战
背景
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 的开发方式就感觉一个词:不明觉厉。
时间流逝,经验增加,财富增加,幸福也会增加。