SPI【Java】
简介
SPI是Java语言中的一种扩展机制。
面向的对象的设计里,基于接口编程是模块之间交互的标准方式,模块之间使用接口而不是特定的实现类可以更好的实现扩展型。在模块进行装配的时候才确定接口的真正类型。
为了避免模块装配时硬编码指定实现类,java spi提供了到接口实现的路由功能,将装配的控制权移到了程序之外,使用配置来进行实现。
SPI全称是 service provider interface,SPI的实现一般位于独立的 JAR 包,在程序调用时候,可以实现自动的路由。
原理
在jdk6里面引进了新的特性ServiceLoader。ServiceLoader的主要作用是用来装载一系列的service provider。
ServiceLoader可以通过配置文件来装载指定的service provider。服务的提供者提供了服务接口的若干实现,只需要在jar包的META-INF/services/目录创建一个以服务接口命名的文件,文件配置了实现该服务接口的具体实现类。
外部程序装配模块的时候,通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。
使用
SLF4J
SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个日志的抽象层( abstraction layer),该框架允许在实际使用的时候装配任意一个实现了抽象层的日志类库。
使用 SLF4J 的过程中上层应用只需要面向SLF4J接口编程,不需要关心具体的底层的日志框架,实现了上层应用和底层日志框架的解耦。
目前主流的日志框架例如log4j, logback都实现了 SLF4J 的 Facade 接口,这些 Jar 包如果在应用的 ClassPath 中就可以自动加载。