可直接注入environment实例调用getproperty等方法动态读取配置,支持类型转换、默认值、存在性判断及多环境优先级覆盖,结合getactiveprofiles()实现profile感知的灵活配置获取。

直接注入 Environment 实例,调用 getProperty 等方法即可动态读取任意配置,不依赖注解、不绑定类结构,适合运行时灵活获取。
如何在 Bean 中注入并使用 Environment
Spring Boot 启动时会自动创建并注册 Environment 实例,你只需在任何 Spring 管理的 Bean(如 @Component、@Service)中通过 @Autowired 注入:
- 注入方式简洁明确,无需额外配置
- 支持在任意生命周期阶段调用,包括构造器、初始化方法或业务逻辑中
- 可配合条件判断、多环境切换等动态场景使用
常用读取方法与细节说明
Environment 提供了多个实用方法,核心是 getProperty,但要注意返回值和类型处理:
-
getProperty(String key):返回String,键不存在时返回null -
getProperty(String key, Class<t> targetType)</t>:指定目标类型(如Integer.class),自动转换,失败时返回null -
getProperty(String key, Class<t> targetType, T defaultValue)</t>:带默认值的安全读取,类型不匹配时返回默认值 -
containsProperty(String key):先判断键是否存在,避免空指针风险 -
getRequiredProperty(String key):强制要求键存在,不存在时抛IllegalArgumentException
配置优先级对读取结果的影响
读取结果取决于配置源的叠加顺序,Spring Boot 默认按以下从高到低优先级加载:
- 命令行参数(
--server.port=9090) - 操作系统环境变量(如
SERVICE_NAME=myapp) - JVM 系统属性(
-Dmy.timeout=5000) -
application.yml/application.properties - 默认属性(通过
ConfigurableEnvironment#setDefaultProperties设置)
同一 key 出现在多个来源时,优先级高的值会覆盖低的——Environment 内部按此顺序遍历 PropertySource 列表,找到第一个即返回。
结合 profile 动态读取配置
可通过 Environment 获取当前激活的 profile,并据此读取对应配置:
-
getActiveProfiles()返回字符串数组,例如{"dev", "test"} -
getDefaultProfiles()获取默认 profile(未显式激活时启用) - 配合
profile-specific配置文件(如application-dev.yml)使用,无需硬编码分支逻辑 - 示例:
environment.getProperty("redis.host", String.class, "localhost")在 dev 环境返回127.0.0.1,prod 环境返回真实地址











