首先我们需要了解在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技术站