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 的開發方式就感覺一個詞:不明覺厲。

時間流逝,經驗增加,財富增加,幸福也會增加。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM