Seata分布式事务:跨服务数据一致性保障
2026/8/1 2:20:37
Java SPI是通过策略模式实现的,一个接口提供多个实现类,而使用哪个实现类不在程序中确定,而是配置文件配置的,具体步骤如下
写个Demo演示一下
publicinterfaceCar{voidgetBrand();}publicclassBenzCarimplementsCar{@OverridepublicvoidgetBrand(){System.out.println("benz");}}publicclassBMWCarimplementsCar{@OverridepublicvoidgetBrand(){System.out.println("bmw");}}org.apache.dubbo.Car的内容如下
org.apache.dubbo.BenzCar org.apache.dubbo.BMWCar测试类
publicclassJavaSpiDemo{publicstaticvoidmain(String[]args){ServiceLoader<Car>carServiceLoader=ServiceLoader.load(Car.class);// benz// bmwcarServiceLoader.forEach(Car::getBrand);}}为了理解 Sentinel 为什么重写 SPI,可以看它们的对比:
| 特性 | Java 原生 SPI (ServiceLoader) | Sentinel SPI (SpiLoader) |
|---|---|---|
| 配置文件路径 | META-INF/services/ | META-INF/services/ 或 META-INF/csp/ |
| 加载方式 | 每次调用产生新实例,懒加载 | 内部使用 ConcurrentHashMap 缓存,支持单例模式 |
| 加载顺序/优先级 | 无序(取决于 classpath 顺序) | 支持通过 @Spi(order = …) 设置加载顺序/优先级 |
| 排序方向 | 无 | 支持 ORDER_ASC(升序)和 ORDER_DESC(降序) |
| 条件过滤 | 无 | 支持通过注解按条件按需加载 |