Springboot读取配置文件的方式

@Value方式

在Spring框架中,@Value注解用于将外部配置文件中的值注入到类的字段中。通过这种方式,可以灵活地配置应用程序,并且在需要更改配置时,只需修改配置文件即可,无需重新编译代码。

配置文件 application.properties

application.properties 文件中定义配置项:

# Application properties for testing @Value annotation
test.value.request.url=https://openapi.alipay.com/gateway.do
test.value.request.app.id=2019052960295228
test.value.request.sign.key=FFFFEA911121494981C5FEBA599C3A99
test.value.request.encrypted.key=EEEE9CA14DE545768A0BD9F1435EE507
test.value.request.timeout=20

ValueService Class

package com.alian.properties.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

@Service
public class ValueService {

    @Value("${test.value.request.url}")
    private String requestUrl;

    @Value("${test.value.request.app.id}")
    private String requestAppId;

    @Value("${test.value.request.sign.key}")
    private String requestSignKey;

    @Value("${test.value.request.encrypted.key}")
    private String requestEncryptedKey;

    @Value("${test.value.request.timeout:20}")
    private int requestTimeout;

    @PostConstruct
    public void testValue() {
        System.out.println("-------------------@Value Testing Starts-------------------");
        System.out.println("Request URL: " + requestUrl);
        System.out.println("Request App ID: " + requestAppId);
        System.out.println("Request Sign Key: " + requestSignKey);
        System.out.println("Request Encrypted Key: " + requestEncryptedKey);
        System.out.println("Request Timeout (Default if not set): " + requestTimeout);
        System.out.println("-------------------@Value Testing Ends-------------------");
    }
}

@ConfigurationProperties方式(推荐)

当使用@ConfigurationProperties时,您可以创建一个POJO(Plain Old Java Object)类来映射配置文件中的属性,并使用Spring的自动装配功能将配置值注入到该类的实例中。这种方式更符合面向对象的思想,并且提供了类型安全和更好的封装性。

# Application properties for testing @ConfigurationProperties annotation
test.value.request.url=https://openapi.alipay.com/gateway.do
test.value.request.app.id=2019052960295228
test.value.request.sign.key=FFFFEA911121494981C5FEBA599C3A99
test.value.request.encrypted.key=EEEE9CA14DE545768A0BD9F1435EE507
test.value.request.timeout=20
package com.alian.properties.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "test.value")
public class ValueProperties {

    private String requestUrl;
    private String requestAppId;
    private String requestSignKey;
    private String requestEncryptedKey;
    private int requestTimeout;

    // Getters and Setters
    // You can generate getters and setters automatically in most IDEs,
    // or you can write them manually if you prefer.
    
    public String getRequestUrl() {
        return requestUrl;
    }

    public void setRequestUrl(String requestUrl) {
        this.requestUrl = requestUrl;
    }

    public String getRequestAppId() {
        return requestAppId;
    }

    public void setRequestAppId(String requestAppId) {
        this.requestAppId = requestAppId;
    }

    public String getRequestSignKey() {
        return requestSignKey;
    }

    public void setRequestSignKey(String requestSignKey) {
        this.requestSignKey = requestSignKey;
    }

    public String getRequestEncryptedKey() {
        return requestEncryptedKey;
    }

    public void setRequestEncryptedKey(String requestEncryptedKey) {
        this.requestEncryptedKey = requestEncryptedKey;
    }

    public int getRequestTimeout() {
        return requestTimeout;
    }

    public void setRequestTimeout(int requestTimeout) {
        this.requestTimeout = requestTimeout;
    }
}

可以在任何需要使用这些配置属性的地方注入ValueProperties类,并直接使用其实例变量:

package com.alian.properties.service;

import com.alian.properties.config.ValueProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

@Service
public class ValueService {

    @Autowired
    private ValueProperties valueProperties;

    @PostConstruct
    public void testValue() {
        System.out.println("-------------------@ConfigurationProperties Testing Starts-------------------");
        System.out.println("Request URL: " + valueProperties.getRequestUrl());
        System.out.println("Request App ID: " + valueProperties.getRequestAppId());
        System.out.println("Request Sign Key: " + valueProperties.getRequestSignKey());
        System.out.println("Request Encrypted Key: " + valueProperties.getRequestEncryptedKey());
        System.out.println("Request Timeout (Default if not set): " + valueProperties.getRequestTimeout());
        System.out.println("-------------------@ConfigurationProperties Testing Ends-------------------");
    }
}

注意

  1. 属性前缀匹配: @ConfigurationProperties注解中的value属性指定了配置文件中的属性前缀。例如,如果配置文件中有app.nameapp.version等属性,它们将会被映射到@ConfigurationProperties注解标记的类中。

  2. 使用@Data和@Component: @Data注解来自于Lombok库,用于自动生成类的Getter、Setter、equals、hashCode和toString等方法。@Component注解用于将类标记为Spring组件,从而使得Spring能够扫描到并管理这个类。这两个注解通常与@ConfigurationProperties一起使用,以便让Spring能够自动装配配置属性。

  3. 内部类对象: 如果配置类中包含内部类对象,则内部类也需要添加@Data注解,以确保能够正确地映射数据。如果内部类没有@Data注解,Spring可能无法正确地映射配置文件中的属性到内部类对象中。

  4. .properties文件映射规则: 当使用.properties类型的配置文件时,配置属性的命名约定是,短横线(-)后面的首个字母会变成大写。例如,如果配置文件中有app.max-connections=100,则在Java中对应的属性名称应该是maxConnections

  5. 内部类的写法: 如果配置类中有内部类对象,通常建议将内部类声明为静态内部类,并且添加@Data注解。这样可以确保内部类能够正确地映射数据,并且避免因为内部类对象的引用而导致的潜在问题。


Environment方式

要获取Spring中的Environment对象,可以通过@Autowired注解将其注入到您的类中。这样做允许在类中使用Environment对象来获取应用程序的配置信息、活动的Profile等。以下是获取Environment对象的方法:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class YourClass {

    @Autowired
    private Environment env;

    public void yourMethod() {
        // 使用Environment对象获取配置属性值
        String propertyValue = env.getProperty("your.property.name");

        // 获取活动的Profile
        String[] activeProfiles = env.getActiveProfiles();
        for (String profile : activeProfiles) {
            System.out.println("Active Profile: " + profile);
        }
    }
}
  • 通过将Environment对象注入到YourClass中,可以在类中使用env对象来获取配置属性值以及活动的Profile信息。
  • 记住,在使用@Autowired注解注入Environment对象时,确保类已经被Spring管理,通常使用@Component或其他适当的注解来标记类。
  • 使用Environment对象获取配置文件的值,最好使用带默认值的方法:getProperty(“配置项key”,“默认值”),避免null值使用Environment对象获取配置文件的值,最好使用带默认值的方法:getProperty(“配置项key”,“默认值”),避免null值

@PropertySource方式

@PropertySource注解允许您将外部属性文件加载到Spring的环境中,从而可以在应用程序中访问这些属性。下面是如何使用@PropertySource注解来加载外部属性文件的示例:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:alian.properties")
public class YourClass {

    @Value("${db.url}")
    private String dbUrl;

    @Value("${db.username}")
    private String dbUsername;

    @Value("${db.password}")
    private String dbPassword;

    // 其他代码...
}

也可以这样

#博客用户
csdn.user-name=Alian
#博客密码
csdn.password=123456
#博客地址
csdn.blog-url=https://blog.csdn.net/Alian_1223
#博客描叙
csdn.blog-desp=来来来,一起聊干货!!!
package com.alian.properties.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "csdn")
@PropertySource(value = "classpath:alian.properties", encoding = "UTF-8", ignoreResourceNotFound = true) 
public class ALianProperties {

    private String userName;

    private String password;

    private String blogUrl;

    private String blogDesp;
}


请注意以下几点:

  • @ConfigurationProperties(value = “csdn”)表示配置文件里属性的前缀都是csdn开头
  • @PropertySource中value属性表示指定配置文件的路径,encoding属性表示指定的是读取配置文件时的编码,记得和文件alian.properties的编码保持一致,ignoreResourceNotFound属性值为true时没找到指定配置文件的时候不报错
  • 配置类上记得加上@Component注解
  • yml 格式不支持这样导入配置
  • @PropertySource中的路径是相对于类路径的,因此在示例中使用了classpath:前缀。
  • 在加载外部属性文件之后,可以通过@Value注解直接将属性值注入到类的字段中。
  • 为了使用@Value注解,需要确保YourClass类被Spring管理,通常使用@Component或其他适当的注解来标记类。

直接代码获取

无论是.properties文件还是.yml文件,其内容都遵循了类似的键值对的结构。每一行包含一个键值对,键与值之间使用等号(=)或冒号(:)分隔,注释可以使用井号(#)或双斜杠(//)开头。

.properties文件的格式相对简单,适用于简单的配置需求。而.yml文件则更加灵活和易读,支持层级结构,适用于复杂的配置情景。

# Database Configuration
db.url=jdbc:mysql://localhost:3306/mydatabase
db.username=admin
db.password=secret

# Server Configuration
server.port=8080
server.host=localhost
# Database Configuration
db:
  url: jdbc:mysql://localhost:3306/mydatabase
  username: admin
  password: secret

# Server Configuration
server:
  port: 8080
  host: localhost
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Main {

    public static void main(String[] args) {
        Properties properties = new Properties();
        InputStream input = null;

        try {
            // 读取外部属性文件
            input = new FileInputStream("alian.properties");

            // 加载属性文件到Properties对象
            properties.load(input);

            // 获取属性值
            String dbUrl = properties.getProperty("db.url");
            String dbUsername = properties.getProperty("db.username");
            String dbPassword = properties.getProperty("db.password");

            // 打印属性值
            System.out.println("DB URL: " + dbUrl);
            System.out.println("DB Username: " + dbUsername);
            System.out.println("DB Password: " + dbPassword);
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    // 关闭输入流
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值