6.Environment
Environment 是外部化的抽象,是多种数据来源的集合。从中可以读取 application 配置文件,环境变量,系统属
性。使用方式在 Bean 中注入 Environment。调用它的 getProperty(key)方法。
为什么不叫外部话的对象??? 而是抽象
因为人家压根就不是类,而是一个接口,还是子接口
在Spring Boot中,Environment
是一个非常重要的接口,它提供了配置属性的读取功能,允许应用程序访问各种环境配置信息,包括命令行参数、系统属性、环境变量以及配置文件中的属性等。
以下是关于 Environment
对象的详细介绍:
- 作用
Environment
接口的主要作用是提供对应用程序配置的访问。它允许开发者在运行时动态获取配置信息,而无需硬编码配置值。这些配置信息可以来自多种来源,例如:
- 配置文件(如
application.properties
或application.yml
) - 命令行参数
- 系统属性
- 环境变量
- 获取
Environment
对象
在Spring Boot应用程序中,可以通过以下几种方式获取 Environment
对象:
(1)通过 @Autowired
注入
java复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class EnvironmentExample {
@Autowired
private Environment environment;
public void printProperty() {
String propertyValue = environment.getProperty("my.property");
System.out.println("Property value: " + propertyValue);
}
}
配置来源
Environment
对象可以从多种来源加载配置信息,这些来源的优先级顺序如下(从高到低):
-
命令行参数
- 例如:
--my.property=value
- 例如:
-
系统属性
- 例如:
System.setProperty("my.property", "value")
- 例如:
-
环境变量
- 例如:
MY_PROPERTY=value
- 例如:
-
配置文件
- 如
application.properties
或application.yml
文件
- 如
-
默认属性
- 可以通过
Environment
的setProperties
方法设置
- 可以通过
-
常用方法
Environment
提供了许多方法来访问配置信息,以下是一些常用方法:
(1)getProperty(String key)
根据键获取配置值,如果键不存在,则返回 null
。
java复制
String value = environment.getProperty("my.property");
(2)getProperty(String key, String defaultValue)
根据键获取配置值,如果键不存在,则返回默认值。
java复制
String value = environment.getProperty("my.property", "default-value");
(3)getProperty(String key, Class<T> targetType)
根据键获取配置值,并将其转换为目标类型。
java复制
int value = environment.getProperty("my.property", Integer.class);
(4)containsProperty(String key)
检查是否存在某个配置键。
java复制
boolean exists = environment.containsProperty("my.property");
- 使用场景
Environment
对象在许多场景中都非常有用,例如:
- 动态配置
- 根据环境变量或命令行参数动态调整应用程序的行为。
- 多环境配置
- 使用不同的配置文件(如
application-dev.properties
、application-prod.properties
)来区分开发环境、测试环境和生产环境。
- 使用不同的配置文件(如
- 集成外部配置
- 从外部系统(如配置中心)加载配置信息。
- 与
@Value
注解的区别
虽然 @Value
注解也可以用来注入配置值,但它主要用于将配置值注入到字段中,而 Environment
对象提供了更灵活的配置访问方式,可以在运行时动态获取和解析配置值。
例如:
java复制
@Value("${my.property}")
private String propertyValue;
这种方式只能在字段注入时使用,而 Environment
可以在方法中动态获取配置值。
- 总结
Environment
对象是Spring Boot中用于管理配置信息的核心组件。它提供了灵活的配置访问方式,支持多种配置来源,并允许开发者在运行时动态获取配置值。通过合理使用 Environment
,可以实现更加灵活和可扩展的应用程序配置管理。
应用
当数据来源,多个地方时,使用 Environment 更加方便
app:
name: yanyu666
password: 123
age: 20
address: 赣州
package com.yanyu.config3.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.core.env.PropertyResolver;
import org.springframework.stereotype.Service;
/**
* @Author yanyu666_508200729@qq.com
* @Date 2025/3/18 22:35
* @description:利用环境接口读取配置信息
* application . yml
* app:
* name: yanyu666
* password: 123
* age: 20
* address: 赣州
*/
@Service
public class ReadEnvironment {
// PropertyResolver environment;
// 直接写 Environment 的父接口也是没问题的,自动转型嘛
@Autowired
Environment environment;
public void environmentTest(){
// 利用 环境接口去读取 属性文件 application . yml
// 读取单个值
String appName = environment.getProperty("app.name");
System.out.println("app.name=\t" + appName);
// 判断某个值是否存在 app . password 是否存在
boolean flag = environment.containsProperty("app.password");
System.out.println("app.password 是否存在" + flag);
// 读取值,转为期待的类型,默认值18
Integer appAge = environment.getProperty("app.age", Integer.class, 18);
System.out.println("app.age=\t" + appAge);
}
}
package com.yanyu.config3;
import com.yanyu.config3.service.ReadEnvironment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Config3ApplicationTests {
@Autowired
ReadEnvironment readEnvironment;
@Test
void contextLoads() {
}
// 利用 IOC注入 ReadEnvironment
// 加上 测试注解,自行提前,添加好 junit 依赖
@Test
void test1(){
readEnvironment.environmentTest();
}
}
7.import组织多文件
大型集成的第三方框架,中间件比较多。每个框架的配置细节相对复杂。如果都将配置集中到一个 application 文件,导致文件内容多,不易于阅读。我们将每个框架独立一个配置文件,最后将多个文件集中到 application。 我们使用导入文件的功能。
需求:项目集成 redis,数据库 mysql。
将 redis,数据库单独放到独立的配置文件。
.properties
- db.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/yanyu
user: root
password: 123
- redis.yml
spring:
redis:
host: 127.0.0.1
port: 6379
password: 123
- application.properties
spring.application.name=config4_import
#导入 db redis . yml
spring.config.import=conf/db.yml,conf/redis.yml
- 读取配置
package com.yanyu.config4_import.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
/**
* @Author yanyu666_508200729@qq.com
* @Date 2025/3/22 23:39
* @description:
*/
@Service
public class ImportTest {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.redis.host}")
private String host;
public void print(){
System.out.println(url);
System.out.println(host);
}
}
- 测试
package com.yanyu.config4_import;
import com.yanyu.config4_import.service.ImportTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Config4ImportApplicationTests {
// 读取容器注入的对象
@Autowired
private ImportTest importTest;
@Test
void contextLoads() {
}
@Test
void test1(){
importTest.print();
}
}
.yml
其它一样
spring:
config:
import: conf/db.yml,conf/redis.yml
8.多环境配置
软件开发中经常提到环境这个概念,与日常生活中的环境概念一样。环境影响居住体验。影响软件运行的也 叫做环境,例如应用中访问数据库的 ip,用户名和密码,Redis 的端口,配置文件的路径,windows,linux 系统, tomcat 服务器等等。围绕着程序周围的都是环境。环境影响软件的运行。 Spring Profiles 表示环境,Profiles 有助于隔离应用程序配置,并使它们仅在某些环境中可用。常说开发环境, 测试环境,生产环境等等。一个环境就是一组相关的配置数据, 支撑我们的应用在这些配置下运行。应用启动 时指定适合的环境。开发环境下每个开发人员使用自己的数据库 ip,用户,redis 端口。 同一个程序现在要测试 了。需要把数据库 ip,redis 的改变为测试服务器上的信息。 此时使用多环境能够方便解决这个问题。
Spring Boot 规定环境文件的名称 application-{profile}.properties(yml)。其中 profile 为自定义的环境名称,推
荐使用 dev 表示开发 ,
test 表示测试。
prod 表示生产,
feature 表示特性。
总是 profile 名称是自定义的。Spring Boot 会加载 application 以及 application-{profile}两类文件,不是只单独加载 application-{profile}。 需求: 项目使用多环境配置,准备一个开发环境,一个测试环境
- 配置环境
app:
memo: 开发环境
# 给改环境起名字
spring:
config:
activate:
on-profile: dev
app:
memo: 测试环境
# 起名字
spring:
config:
activate:
on-profile: test
package com.yanyu.config5.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
/**
* @Author yanyu666_508200729@qq.com
* @Date 2025/3/23 0:20
* @description:
*/
@Service
public class EnvironmentTest {
@Value("${app.memo}")
private String memo;
public void print(){
System.out.println(memo);
}
}
package com.yanyu.config5;
import com.yanyu.config5.service.EnvironmentTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Config5ApplicationTests {
@Autowired
EnvironmentTest environmentTest;
@Test
void contextLoads() {
}
@Test
void test1(){
environmentTest.print();
}
}
- 更改未测试环境