在Spring框架的上下文初始化过程中,ServiceLoader 被用来加载和注册各种服务和处理器 。
- Java JDBC API:
- Java Image I/O API:
- Java 6 中的 java.util.ServiceLoader:
- Java Logging API:
三、 Spring Boot 对 SPI 的改造和扩展Spring Boot 对 SPI 机制进行了改造和扩展,使其成为 Spring Boot 自动配置的核心机制之一 。这种改造和扩展主要体现在以下几个方面:
- 自动配置:
开发者可以通过在 spring.factories 文件中声明自己的自动配置类 , 来扩展或修改 Spring Boot 的默认行为 。
- 条件装配:
- Spring Boot 的自动配置利用了 @Conditional 注解(如 @ConditionalOnClass,@ConditionalOnBean 等),使得仅在满足特定条件时 , 相关的自动配置类才会被激活和应用 。
- 这种机制结合 ServiceLoader 使得 Spring Boot 能够在运行时根据环境(例如类路径中的类、定义的beans、系统属性等)灵活地加载不同的配置 。
- 扩展点:
- Spring Boot 允许开发者通过添加自己的 spring.factories 来扩展或覆盖默认的自动配置 , 这提供了一个强大的扩展点,使得开发者可以根据自己的需要自定义配置 。
四、 思考与拓展类似于ServiceLoader的这种SPI机制 , 我更愿意称它为一种框架的插件机制,因为它提供了一种插拔机制 , 可以让第三方开发人员很容易的对框架进行功能的拓展,这种机制对原框架的功能和新拓展的功能进行了解耦,他们之间通过接口约定 , 然后基于SPI进行插拔式拓展,非常的灵活 。除了 SPI,还有一些其他机制和模式也被用于扩展框架功能,主要包括:
- 插件架构(Plugin Architecture):
插件通常是独立于主应用程序的,通过预定义的API与主应用程序交互 。
- 事件驱动架构(Event-Driven Architecture, EDA):
- 在事件驱动架构中,组件之间的通信是基于事件的 。这种模式允许应用程序在发生特定事件时触发新的行为,而无需更改发出事件的代码 。
- 这种模式在框架中常用于处理用户界面动作、消息传递等场景 。
- 反射和动态代理(Reflection and Dynamic Proxy):
