在之前的JVM 分析系列之类加载提到过 Java SPI 机制,主要是类加载器反双亲委派的实现(第三方包不在指定jdk路径,一般类加载器无法加载,需要特殊的ContextClassLoader加载以便使用)。本次将对 SPI机制进行详解,并结合案例介绍其在实际场景中具体使用。
鉴于目前实际项目涉及范围,总结出的常见应用场景。
使用场景一:
package com.lgy.spidemo.serviceway;
/**
* @description: 考勤接口
**/
public interface AttendanceService {
void pullAttendanceInfos();
}
/**
* @description: 职能部门考勤实现
**/
public class FunctionAttendanceServiceImpl implements AttendanceService {
@Override
public void pullAttendanceInfos() {
System.out.println(" FunctionAttendanceService implements ...");
// 逻辑忽略
}
}
/**
* @description: 销售部门考勤实现
**/
public class SaleAttendanceServiceImpl implements AttendanceService {
@Override
public void pullAttendanceInfos() {
System.out.println(" SaleAttendanceService implements ...");
// 逻辑忽略
}
}
/**
* 1、项目的srcmainresources下创建META-INFservices目录
* 2、META-INFservices的目录下再增加一个配置文件,这个文件必须以接口的全限定类名保持一致 (com.lgy.spidemo.service.SpiService)
* 3、在配置文件中写入具体实现类的全限定类名,如有多个便换行写入 com.lgy.spidemo.service.impl.SaleAttendanceServiceImpl
com.lgy.spidemo.service.impl.FunctionAttendanceServiceImpl
**/
public class AttendanceServiceTest {
public static void main(String[] args) {
ServiceLoader< AttendanceService > services =
ServiceLoader.load(AttendanceService.class);
// 省略判断人员部门类型逻辑
// 测试输出结果,展示实现接口已加载
for (AttendanceService service : services) {
service.pullAttendanceInfos();
}
}
}
// 两个实现类均被加载成功,在实际使用时,可根据需要去调用不同的实现。
FunctionAttendanceService implements ...
SaleAttendanceService implements ....
结合场景一分析:
使用场景二
package com.lgy.spidemo.factoriesway;
import org.springframework.boot.autoconfigure.AutoConfigurationImportEvent;
import org.springframework.boot.autoconfigure.AutoConfigurationImportListener;
/**
* @description: 自动配置swagger
**/
public class SwaggetAutoConfiguration {
public SwaggetAutoConfiguration() {
System.out.println(" SwaggetAutoConfiguration init ...");
}
// 配置内容省略
}
/**
* @description: 自动配置dataway
**/
public class DataWayAutoConfiguration {
public DataWayAutoConfiguration() {
System.out.println(" DataWayAutoConfiguration init ...");
}
// 配置内容省略
}
/**
* resource/META-INFO/spring.factories 文件内容 *
* org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.lgy.spidemo.factoriesway.SwaggetAutoConfiguration
* 输出结果:SwaggetAutoConfiguration init ...
**/
结合场景二分析:
全部0条评论
快来发表一下你的评论吧 !