- yaml文件的profile用法
- 第二种方式
- SPI可插拔原则
- serviceCommon定义标准服务接口
- ali_pay服务具体实现方
- main_test服务调用方
第一种方式在一个文件中使用spring:
profiles:
active: default进行开启
- yml文件
acme:
enable: true
remote-address: 192.168.184.1
spring:
profiles:
active: default
---
acme:
enable: true
remote-address: 192.168.184.2
spring:
profiles: dev
---
acme:
enable: true
remote-address: 192.168.184.5
spring:
profiles: pro
- model类
@Data
@Component
@ConfigurationProperties(prefix = "acme")
public class AcmeProperties {
private boolean enable;
private InetAddress remoteAddress;
}
- controller
@RestController
public class TestController {
@Autowired
private AcmeProperties acmeProperties;
@RequestMapping("/get")
public AcmeProperties get(){
System.out.println(acmeProperties);
return acmeProperties;
}
}
第二种方式
以文件名称为规范 开启的时候在application.yml主文件中开启一个,开启的规范是子yml文件横线后缀的名称
- application.yml文件
spring:
profiles:
active: dev
- application-dev.yml文件
acme: enable: true remote-address: 192.168.184.2
还支持进行EL表达式进行获取
- model
@Data
@Component
@ConfigurationProperties(prefix = "acme")
public class AcmeProperties {
private boolean enable;
private InetAddress remoteAddress;
private String host;
}
- yml文件
acme:
enable: true
remote-address: 192.168.184.2
host: ${acme.remote-address}:8080
SPI可插拔原则
概念参考文章链接: 读懂Springboot自动配置原理必会的java SPI思想
serviceCommon定义标准服务接口简单来说Java SPI 分三个部分:服务调用方、接口提供方、服务提供方。以com.jdbc.driver为例,用户在配置文件中调用(服务调用方),jdk自带了这个接口不做任何实现(接口提供方)、服务提供方(第三方的厂商根据不同数据库驱动进行实现)。Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。
新建工程seviceCommon
- 定义接口
public interface PayService {
void pay();
}
ali_pay服务具体实现方
新建工程ali_pay
- pom文件引入seviceCommon组件,方便实现serviceCommon中的接口
sevice_common org.example 1.0-SNAPSHOT
- 具体实现接口
public class AliPayServiceImpl implements PayService {
@Override
public void pay() {
System.out.println("支付宝支付");
}
}
要实现JavaSPI的规范还需要在配置包resources下建立META-INF/services路径的包,该包下新建一个文件(命名规范是实现接口的全路径)
- 新建文件cn.tx.service.PayService,里面是具体实现类的全路径名称
cn.tx.serviceImpl.AliPayServiceImplmain_test服务调用方
调用服务的时候需要在pom文件中引入相关组件
org.example ali_pay 1.0-SNAPSHOT
- 服务调用
public class MainTest {
public static void main(String[] args) {
ServiceLoader load = ServiceLoader.load(PayService.class);
for (PayService service : load) {
service.pay();
}
}
}
使用Java SPI机制的优势是实现解耦,使得第三方服务模块的装配控制的逻辑与调用者的业务代码分离,而不是耦合在一起。应用程序可以根据实际业务情况启用框架扩展或替换框架组件。
Springboot的原理即是使用期原理来做的自动配置。



