SpringBoot前置知识-SPI接口
介绍
Java中SPI是一种服务发现机制,或者说是一种思想,亦是一种约定。其实JDK中的JDBC就是使用了这种用思想,JDBC在JDK中只定义了接口,并没有实现类,连接什么数据库就要引入什么数据库的驱动。
SPI通过在ClassPath路径下的META-INF/services文件夹下通过创建文件实现服务注册,文件名为要实现接口的全限定名,内容为实现类的全限定名。
实践
分别创建三个maven项目JDBCModule,MySQLModule,OracleModule,其中MySQLModule,OracleModule实现JDBCModule中的JdbcService接口
JDBCModule
创建一个JdbcService接口
package com.jdbc; /** * @Author * @Date 2024/5/23 21:38 */ public interface JdbcService { void connection(); }
pom文件中引入MySQLModule,OracleModule打成的jar包
com.oracle OralceModule 1.0-SNAPSHOT com.mysql MySqlModule 1.0-SNAPSHOT
MySQLModule
引入JDBCModule打成的jar包
com.jdbc JDBCModule 1.0-SNAPSHOT
定义JdbcService的实现类
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接口的实现
public class AppMain { public static void main(String[] args) { ServiceLoaderload = ServiceLoader.load(JdbcService.class); Iterator iterator = load.iterator(); while (iterator.hasNext()){ iterator.next().connection(); } } }
这是Oracle... 这是Mysql... Process finished with exit code 0
总结
SpringBoot的核心思想是“约定大于配置”,由此可以看出Spring发展为SpringBoot是必然结果。技术在变,但是思想不会变。
还没有评论,来说两句吧...