环境配置与读取yml

6.Environment

Environment 是外部化的抽象,是多种数据来源的集合。从中可以读取 application 配置文件,环境变量,系统属

性。使用方式在 Bean 中注入 Environment。调用它的 getProperty(key)方法。

为什么不叫外部话的对象??? 而是抽象

因为人家压根就不是类,而是一个接口,还是子接口

image-20250318223718404

在Spring Boot中,Environment 是一个非常重要的接口,它提供了配置属性的读取功能,允许应用程序访问各种环境配置信息,包括命令行参数、系统属性、环境变量以及配置文件中的属性等。

以下是关于 Environment 对象的详细介绍:

  1. 作用

Environment 接口的主要作用是提供对应用程序配置的访问。它允许开发者在运行时动态获取配置信息,而无需硬编码配置值。这些配置信息可以来自多种来源,例如:

  • 配置文件(如 application.propertiesapplication.yml
  • 命令行参数
  • 系统属性
  • 环境变量
  1. 获取 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 对象可以从多种来源加载配置信息,这些来源的优先级顺序如下(从高到低):

  1. 命令行参数

    • 例如:--my.property=value
  2. 系统属性

    • 例如:System.setProperty("my.property", "value")
  3. 环境变量

    • 例如:MY_PROPERTY=value
  4. 配置文件

    • application.propertiesapplication.yml 文件
  5. 默认属性

    • 可以通过 EnvironmentsetProperties 方法设置
  6. 常用方法

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");
  1. 使用场景

Environment 对象在许多场景中都非常有用,例如:

  • 动态配置
    • 根据环境变量或命令行参数动态调整应用程序的行为。
  • 多环境配置
    • 使用不同的配置文件(如 application-dev.propertiesapplication-prod.properties)来区分开发环境、测试环境和生产环境。
  • 集成外部配置
    • 从外部系统(如配置中心)加载配置信息。
  1. @Value 注解的区别

虽然 @Value 注解也可以用来注入配置值,但它主要用于将配置值注入到字段中,而 Environment 对象提供了更灵活的配置访问方式,可以在运行时动态获取和解析配置值。

例如:

java复制

@Value("${my.property}")
private String propertyValue;

这种方式只能在字段注入时使用,而 Environment 可以在方法中动态获取配置值。

  1. 总结

Environment 对象是Spring Boot中用于管理配置信息的核心组件。它提供了灵活的配置访问方式,支持多种配置来源,并允许开发者在运行时动态获取配置值。通过合理使用 Environment,可以实现更加灵活和可扩展的应用程序配置管理。

应用

当数据来源,多个地方时,使用 Environment 更加方便

image-20250318224831619

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();
    }

}

image-20250318224948906

7.import组织多文件

大型集成的第三方框架,中间件比较多。每个框架的配置细节相对复杂。如果都将配置集中到一个 application 文件,导致文件内容多,不易于阅读。我们将每个框架独立一个配置文件,最后将多个文件集中到 application。 我们使用导入文件的功能。

需求:项目集成 redis,数据库 mysql。

将 redis,数据库单独放到独立的配置文件。

image-20250322233506018

.properties

image-20250322235900898

  • 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();
	}

}

image-20250323000229826

.yml

其它一样

spring:
  config:
    import: conf/db.yml,conf/redis.yml

image-20250323000502649

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}。 需求: 项目使用多环境配置,准备一个开发环境,一个测试环境

image-20250323001554925

  • 配置环境
app:
  memo: 开发环境
#  给改环境起名字
spring:
  config:
    activate:
      on-profile: dev
app:
  memo: 测试环境
#  起名字
spring:
  config:
    activate:
      on-profile: test

image-20250323002644173

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();
	}


}

image-20250323002721255

  • 更改未测试环境

image-20250323002759856

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@yanyu666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值