【Java基础】:java之Spi 小实战!

背景

Java 中区分 Api 和 Spi,通俗的讲:Api 和 Spi 都是相对的概念,他们的差别只在语义上,Api 直接被应用开发人员使用,Spi 被框架扩张人员使用,详细内容可以看: 【Java基础】java详解SPI和API
 

Java类库中的实例

代码

 

Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/test", "root", "123456");
        Statement stmt = conn.createStatement();

        ResultSet rs = stmt.executeQuery("select * from Users");

 

说明

java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 实现,其它的都是 Api。

如何实现这种结构?

代码

public class Program {

    public static void main(String[] args) throws InstantiationException,
            IllegalAccessException, ClassNotFoundException {
        Class.forName("SpiA");

        Api api = new Api("a");
        api.Send("段光伟");
    }
}
import java.util.*;

public class Api {
    private static HashMap<String, Class<? extends Spi>> spis = new HashMap<String, Class<? extends Spi>>();
    private String protocol;

    public Api(String protocol) {
        this.protocol = protocol;
    }

    public void Send(String msg) throws InstantiationException,
            IllegalAccessException {
        Spi spi = spis.get(protocol).newInstance();

        spi.send("消息发送开始");
        spi.send(msg);
        spi.send("消息发送结束");
    }

    public static void Register(String protocol, Class<? extends Spi> cls) {
        spis.put(protocol, cls);
    }
}
 public interface Spi {
    void send(String msg);
 }
public class SpiA implements Spi {
    static {
        Api.Register("a", SpiA.class);
    }

    @Override
    public void send(String msg) {
        System.out.println("SpiA:" + msg);
    }

}

说明

Spi 实现的加载可以使用很多种方式,本文介绍了一种最基本的方式。

备注:每一次思考都伴随着收获,也离不开和朋友们的交流,欢迎加入我们的Java学习基地,一起交流学习,共同进步:925050116(我们也会定期分享一些学习干货)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值