SpringBoot前置知识-SPI接口
介绍
Java中SPI是一种服务发现机制,或者说是一种思想,亦是一种约定。其实JDK中的JDBC就是使用了这种用思想,JDBC在JDK中只定义了接口,并没有实现类,连接什么数据库就要引入什么数据库的驱动。
SPI通过在ClassPath路径下的META-INF/services文件夹下通过创建文件实现服务注册,文件名为要实现接口的全限定名,内容为实现类的全限定名。
实践
分别创建三个maven项目JDBCModule,MySQLModule,OracleModule,其中MySQLModule,OracleModule实现JDBCModule中的JdbcService接口
JDBCModule
创建一个JdbcService接口
java
package com.jdbc;
/**
* @Author
* @Date 2024/5/23 21:38
*/
public interface JdbcService {
void connection();
}
pom文件中引入MySQLModule,OracleModule打成的jar包
xml
<!--oracle实现jdbc接口-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>OralceModule</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--MySQL实现jdbc接口-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>MySqlModule</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
MySQLModule
引入JDBCModule打成的jar包
xml
<dependency>
<groupId>com.jdbc</groupId>
<artifactId>JDBCModule</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
定义JdbcService的实现类
java
package com.mysql;
import com.jdbc.JdbcService;
/**
* @Author
* @Date 2024/5/23 21:41
*/
public class MySqlServiceImpl implements JdbcService {
@Override
public void connection() {
System.out.println("这是Mysql...");
}
}
在resources目录下创建MATE-INF文件夹,在MATE-INF文件夹下创建文件夹命名为要实现接口的权限的名,当前项目下即JdbcService的全限定名 com.jdbc.JdbcService
内容为实现类的全限定名,即MySqlServiceImpl的全限定名com.mysql.MySqlServiceImpl。这样,接口就能知道实现类了。
OracleModule
和MySQLModule同理
使用
这样在JDBCModule中就可以找到实现类了,或者将JDBCModule打成jar包引入到其他项目中也可以找到接口的实现类了。通过ServiceLoad加载SPI接口的实现
java
public class AppMain {
public static void main(String[] args) {
ServiceLoader<JdbcService> load = ServiceLoader.load(JdbcService.class);
Iterator<JdbcService> iterator = load.iterator();
while (iterator.hasNext()){
iterator.next().connection();
}
}
}
shell
这是Oracle...
这是Mysql...
Process finished with exit code 0
总结
SpringBoot的核心思想是"约定大于配置",由此可以看出Spring发展为SpringBoot是必然结果。技术在变,但是思想不会变。