SpringBoot自定义加载yml实现方式,附源码解读

首先我们需要了解在SpringBoot中如何读取配置文件。SpringBoot 支持的主配置文件类型有两种: .properties.yml 文件格式。在默认情况下,SpringBoot 会优先读取 .properties 文件,如果同时存在两种格式,.yml 文件会覆盖.properties 文件。

然而,有些时候我们需要动态加载一些配置文件,而这些配置文件的名字不能事先确定,这时候我们就需要使用自定义加载配置文件的方式了。下面是示例代码:

实现方式:利用自定义ApplicationContextInitializer来实现yml文件读取

public class MyApplicationContextInitializer implements ApplicationContextInitializer {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
        Resource resource = new FileSystemResource("D:/application.yml");
        try {
            PropertySource<?> propertySource = loader.load("customize-yaml", resource).get(0);
            applicationContext.getEnvironment().getPropertySources().addFirst(propertySource);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这里我们实现了一个 MyApplicationContextInitializer 类,它实现了 ApplicationContextInitializer 接口。通过实现 initialize 方法,我们可以实现在 SpringBoot 启动时加载一个我们自定义的 .yml 文件。

配置类

@SpringBootApplication
@Import(MyApplicationContextInitializer.class)
public class CustomizedApplication {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(CustomizedApplication.class);
        app.run(args);
    }
}

这里我们通过在入口类上加 @Import 注解,将 MyApplicationContextInitializer 类导入,从而实现了自定义加载 .yml 文件的功能。

示例1

首先我们创建一个名为 application.yml 的文件,内容如下:

spring:
  profiles:
    active: dev
---
spring:
  profiles: dev
  server:
    port: 8888

其中我们指定了使用 dev 配置,端口号为 8888

当我们启动应用时,输出日志会显示:

Tomcat started on port(s): 8888 (http)

这说明我们成功读取了自定义的 .yml 文件。可以通过Postman等工具来验证真的能成功访问端口号为 8888\health端点。

示例2

现在我们将 application.yml 文件更名为 test.yml,修改其中端口号为 9999,新建一个空的 application.yml 文件。我们这里演示如何动态加载 test.yml 文件。

我们需要在应用启动时传递一个参数,即指定要加载的 .yml 文件。在 CustomizedApplication 类的 main 方法中加上以下代码:app.setDefaultProperties(Collections.singletonMap("spring.config.name", "test"));

这里我们使用 spring.config.name 属性来指定需要加载的 test.yml 文件,到这里我们便实现了动态加载 test.yml 文件的功能。

完整代码如下所示:

public class MyApplicationContextInitializer implements ApplicationContextInitializer {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
        Resource resource = new FileSystemResource("D:/" + applicationContext.getEnvironment().getProperty("spring.config.name") + ".yml");
        try {
            PropertySource<?> propertySource = loader.load("customize-yaml", resource).get(0);
            applicationContext.getEnvironment().getPropertySources().addFirst(propertySource);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
@SpringBootApplication
@Import(MyApplicationContextInitializer.class)
public class CustomizedApplication {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(CustomizedApplication.class);
        app.setDefaultProperties(Collections.singletonMap("spring.config.name", "test"));
        app.run(args);
    }
}

这就是自定义加载 .yml 文件的方法,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot自定义加载yml实现方式,附源码解读 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java 中DateUtils日期工具类的实例详解

    Java 中DateUtils日期工具类的实例详解 介绍 DateUtils 是 Apache Commons Lang 库中的一个日期工具类,可以实现日期的快速转换、格式化以及时间计算。在处理日期时间相关计算时,使用该工具类可以减少代码的编写量,并提高开发效率。 使用步骤 将 Apache Commons Lang库引入项目依赖: <dependen…

    Java 2023年5月20日
    00
  • Triple协议支持Java异常回传设计实现详解

    Triple协议支持Java异常回传设计实现详解 简介 Triple是一个基于Dubbo及其生态的,由阿里巴巴开源的微服务框架。其提供了完整的远程调用协议,支持Dubbo、gRPC、Hessian和Http等多种协议,同时也支持多种语言,包括Java、Go、Node.js,C++等。Triple的主要目标是提供高性能、轻量级、易使用的微服务解决方案。 本文将…

    Java 2023年5月27日
    00
  • MyBatis中SqlSession实现增删改查案例

    下面我会详细讲解MyBatis中SqlSession实现增删改查的完整攻略,包含了两个具体的示例。 什么是SqlSession SqlSession是MyBatis中的一个接口,用于执行对数据库的增删改查操作。它的实现类是DefaultSqlSession。 在使用MyBatis时,通常先是通过SqlSessionFactory创建一个SqlSession实…

    Java 2023年5月20日
    00
  • Spring 框架中注入或替换方法实现

    Sure! Spring 有很多注入或者替换方法的实现方式,其中比较常见的有以下几种方式: 基于 XML 基于 Java Config 基于注解 下面将逐步介绍这几种方式的具体实现方法和示例。 1. 基于 XML 基于 XML 的方式是 Spring 最早期的实现方式,也是应用最广泛的一种方式。在 XML 中,我们可以通过 <bean> 标签配置…

    Java 2023年5月19日
    00
  • 微信小程序 免费SSL证书https、TLS版本问题的解决办法

    针对“微信小程序 免费SSL证书https、TLS版本问题的解决办法”,我提供如下完整攻略。 什么是SSL证书和TLS版本 SSL证书可以理解为电子商务网站的身份证,用于证明网站的身份,并通过加密通讯来保护信息不被窃取。而TLS是SSL的升级版本,用于加密网络连接,并确保数据的完整性和机密性。 微信小程序使用SSL证书和TLS版本的必要性 微信小程序要求所有…

    Java 2023年5月23日
    00
  • Docker自动部署Apache Tomcat的方法

    Docker是一种容器化技术,它可以让我们更方便地管理和部署应用程序。在这篇攻略中,我将为您介绍如何使用Docker来快速、自动地部署Apache Tomcat容器。 准备工作 在开始之前,您需要先安装好Docker,可以去官网下载相应版本的安装程序,安装完毕后使用以下命令测试是否安装成功: docker –version 如果输出了Docker的版本信息…

    Java 2023年5月19日
    00
  • 小程序实现横向滑动日历效果

    如下是小程序实现横向滑动日历效果的完整攻略: 步骤一:页面布局 页面布局一般使用scroll-view实现横向滑动效果。具体地,在scroll-view中添加一个日历视图即可。通常我们使用一个表格来实现日历视图,表格中的每个格子代表一个日期。代码示例如下: <scroll-view scroll-x="true" class=&qu…

    Java 2023年5月23日
    00
  • extjs 的权限问题 要求控制的对象是 菜单,按钮,URL

    为了实现对菜单、按钮、URL等控件的权限控制,我们需要新建一个Permission控制模块。在该模块中,需要进行用户权限的管理,同时定义相应的权限验证方法。下面是具体的步骤和示例: 定义权限管理器 首先,我们需要定义一个Permission控制器(controller),用来管理用户权限。我们在该控制器中定义了一个init()方法,该方法用来检查是否有权限访…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部