Dubbo SPI 和 Java SPI 区别?
2 个回答
重新审视自己,什么使你快乐,什么就是眼下最珍贵。东方朔Dubbo 的 SPI 机制在 JDK 的 SPI 之上做了增强,使得它更加灵活和高效。以下是它们之间的主要区别: #### 1. **懒加载与预加载** - **JDK SPI**:使用 `ServiceLoader.load()` 方法时会立即加载所有服务实现类,这是**预加载**机制。 - **Dubbo SPI**:使用懒加载,只有在实际使用某个服务实现时才加载,这提升了应用启动速度并减少资源占用。 #### 2. **扩展点自动激活** - **JDK SPI**:不支持自动激活,需要手动选择和使用具体的实现。 - **Dubbo SPI**:支持自动激活,可以在配置文件中指定条件,自动激活匹配的扩展点,实现按需激活。 #### 3. **扩展点依赖注入** - **JDK SPI**:不支持依赖注入,服务提供者需要自己管理依赖。 - **Dubbo SPI**:支持依赖注入,可以自动注入其他扩展点,方便在扩展实现中使用其他服务。 #### 4. **配置文件的位置和格式** - **JDK SPI**:配置文件位于 `META-INF/services` 目录下,文件名为接口全限定名,内容是实现类的全限定名列表。 - **Dubbo SPI**:配置文件位于 `META-INF/dubbo`(或 `META-INF/dubbo/internal`),文件名为接口全名,内容支持键值对形式,可以添加更多描述信息和配置选项。 #### 5. **AOP 支持** - **JDK SPI**:不支持 AOP。 - **Dubbo SPI**:支持通过 Wrapper 类包装扩展点,增强了服务的功能,例如日志、事务等 AOP 功能。 #### 6. **扩展名** - **Dubbo SPI**:允许为服务实现指定名称(扩展名),配置时更直观。 ### Dubbo SPI 和 JDK SPI 的用法 #### JDK SPI 示例 1. **接口和实现类** ```java public interface MyService { void serviceMethod(); } public class MyServiceImpl implements MyService { @Override public void serviceMethod() { System.out.println("Service Method Implemented"); } } ``` 2. **配置文件** 在 `META-INF/services` 目录下创建文件,文件名为 `com.example.MyService`,内容如下: ```plaintext com.example.MyServiceImpl ``` 3. **加载和使用** ```java import java.util.ServiceLoader; public class TestSPI { public static void main(String[] args) { ServiceLoader<MyService> services = ServiceLoader.load(MyService.class); for (MyService service : services) { service.serviceMethod(); } } } ``` #### Dubbo SPI 示例 1. **接口和实现类** ```java public interface PrintService { void print(String message); } public class SimplePrintService implements PrintService { @Override public void print(String message) { System.out.println("Message: " + message); } } ``` 2. **配置文件** 在 `META-INF/dubbo/com.example.PrintService` 文件中添加内容: ```plaintext simplePrintService=com.example.SimplePrintService ``` 3. **加载和使用** ```java import org.apache.dubbo.common.extension.ExtensionLoader; public class TestDubboSPI { public static void main(String[] args) { PrintService printService = ExtensionLoader.getExtensionLoader(PrintService.class).getExtension("simplePrintService"); printService.print("Hello Dubbo SPI"); } } ``` ### 总结 Dubbo 的 SPI 机制增强了 JDK SPI 的功能,支持懒加载、依赖注入、扩展点自动激活和 AOP,能够提供更灵活的扩展方式。这些特性使得 Dubbo 的 SPI 机制适合在复杂场景下扩展应用功能,而 JDK 的 SPI 则适合简单的服务发现和实现加载。编辑于 2024-08-25 05:12 •IP属地 美国举报评论收藏
能治愈生活的良方,是保持对生活的热爱。卢璐说### JDK SPI JDK 标准的 SPI 会一次性加载所有的扩展实现,如果有的扩展吃实话很耗时,但也没用上,很浪费资源。所以只希望加载某个的实现,就不现实了 ### DUBBO SPI 1,对 Dubbo 进行扩展,不需要改动 Dubbo 的源码 2,延迟加载,可以一次只加载自己想要加载的扩展实现。 3,增加了对扩展点 IOC 和 AOP 的支持,一个扩展点可以直接 setter 注入其 它扩展点。 3,Dubbo 的扩展机制能很好的支持第三方 IoC 容器,默认支持 Spring Bean。发布于 2022-03-21 08:57 •IP属地 宁夏举报评论收藏
公众号进入网站体验更佳

