栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

04:Springboot:yaml文件profile用法以及Java spi可插拔原则

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

04:Springboot:yaml文件profile用法以及Java spi可插拔原则

Springboot:yaml文件profile用法以及Java spi可插拔原则
  • yaml文件的profile用法
    • 第二种方式
  • SPI可插拔原则
    • serviceCommon定义标准服务接口
    • ali_pay服务具体实现方
    • main_test服务调用方

yaml文件的profile用法

第一种方式在一个文件中使用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思想

简单来说Java SPI 分三个部分:服务调用方、接口提供方、服务提供方。以com.jdbc.driver为例,用户在配置文件中调用(服务调用方),jdk自带了这个接口不做任何实现(接口提供方)、服务提供方(第三方的厂商根据不同数据库驱动进行实现)。Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。

serviceCommon定义标准服务接口

新建工程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.AliPayServiceImpl
main_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的原理即是使用期原理来做的自动配置。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/949087.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号