如何从BootstrapRegistryInitializer访问application.yml中的Spring属性?
从BootstrapRegistryInitializer访问application.yml属性的正确方式
要在BootstrapRegistryInitializer中读取application.yml的配置,需要完成两步操作:确保bootstrap上下文能加载application.yml,再从bootstrap上下文的Environment中读取目标属性。
1. 让bootstrap上下文加载application.yml
默认情况下,bootstrap上下文仅加载bootstrap.yml/bootstrap.properties这类专属配置文件。要让它加载application.yml以实现配置共享,可通过启动参数或系统属性指定:
- 添加启动参数:
--spring.cloud.bootstrap.name=application - 或者设置系统属性:
spring.cloud.bootstrap.name=application
配置后,bootstrap上下文会和应用上下文共用application.yml,实现一处配置两处生效。
2. 在BootstrapRegistryInitializer中读取属性
修改你的Boostrap类,通过BootstrapRegistry获取已初始化的Environment实例,再从中读取配置属性:
public class Boostrap implements BootstrapRegistryInitializer { @Override public void initialize(BootstrapRegistry registry) { // 从bootstrap上下文获取Environment核心组件 Environment environment = registry.getRegisteredInstance(Environment.class); // 读取myProps.username,第二个参数为可选默认值 String username = environment.getProperty("myProps.username", "DefaultUser"); registry.register( AwsParameterStoreClientCustomizer.class, context -> new ParameterStoreClientCustomizer(username) ); registry.register(BootstrapItem.class, context -> new BootstrapItem("Test 123")); } }
说明
Environment是bootstrap上下文初始化阶段就已注册的核心组件,直接通过registry.getRegisteredInstance()即可获取。- 使用
getProperty()时可指定默认值,避免配置缺失导致的空指针问题。
内容的提问来源于stack exchange,提问作者JGleason
相关产品推荐
相关产品推荐

