SpringBoot 读取环境变量 是开发中必不可少的一部分,下面介绍 SpringBoot 中读取环境变量的几种方法。

在此之前我们先在配置文件 application.properties 文件中配置以下条目:

wx.appkey   = 12345
wx.appsecret = 23456
wx.redirect_uri = https://www.yxjc123.com

1. @Value("${proprties}") 注解

我们可以在SpringBoot 中使用这些属性文件,以下是使用方法。

@RestController
public class PropsController {
    @Value("${wx.appkey}")
    private String appkey;//配置参数appkey
    @Value("${wx.appsecret}")
    private String appsecret;//配置参数appsecret

    @RequestMapping("/prop")
    public String prop() {
        return appkey + ":" + appsecret;
    }
}

使用@Value("${proprties}")注解的方式虽然很容易使用,但是如果我们有多个属性,这将是一个非常繁琐的过程。 SpringBoot 引入了一种新的方法,以更简洁的方式处理这些属性,并提供了验证这些配置值的选项。

2. 使用 @ConfigurationProperties 读取

为了理解这个特性,我们可以举一个自定义属性文件的例子,它包含数据库、电子邮件服务器和微信的配置属性,例如:

#微信
wx.appkey   = 12345
wx.appsecret = 23456
wx.redirect_uri = https://www.yxjc123.com

#数据库配置
spring.datasource.yxjc.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.yxjc.driver-class-name= com.mysql.cj.jdbc.Driver
spring.datasource.yxjc.jdbc-url= jdbc:mysql://127.0.0.1:3306/yxjc123?useUnicode=true&characterEncoding=utf8
spring.datasource.yxjc.username= root
spring.datasource.yxjc.password= root

#qq邮箱配置
spring.mail.host=smtp.qq.com
spring.mail.port=465
spring.mail.username=xxx@qq.com
spring.mail.from=xxx@qq.com
spring.mail.password=password

通过使用 @ConfigurationProperties注解,我们可以定义一个Java类绑定这些属性。

在上面的配置项中,都有各自的前缀,我们可以在@ConfigurationProperties 注解上使用前缀属性,比如wx,

package com.example.yxjc.props;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "wx")
public class WxProps {

    private String appkey;
    private String appsecret;
    private String redirect_uri;

    //getter and setter

    public String getAppkey() {
        return appkey;
    }

    public void setAppkey(String appkey) {
        this.appkey = appkey;
    }

    public String getAppsecret() {
        return appsecret;
    }

    public void setAppsecret(String appsecret) {
        this.appsecret = appsecret;
    }

    public String getRedirect_uri() {
        return redirect_uri;
    }

    public void setRedirect_uri(String redirect_uri) {
        this.redirect_uri = redirect_uri;
    }
}

controller中使用

@RestController
public class PropsController {
   
    @Resource
    private WxProps wxProps;

    @RequestMapping("/prop")
    public String prop() {
        return wxProps.getAppkey() + ":" + wxProps.getAppsecret();
    }
}
我们运行上面的应用程序,所有在属性文件中定义的前缀为"wx"的属性都会自动绑定/分配给这个WxProps 对象。

3. 使用@PropertySource读取配置文件

在处理上述示例时,假设我们想在自定义属性文件 (wx.properties) 中定义这些属性) 而不是在 application.properties 文件中。我们可以使用@PropertySource 注解来义自定义属性文件。

现在我们新建一个wx.properties文件位于目录\yxjcBoot\src\main\resources\wx.properties下,内容还是

#微信
wx2.appkey   = 12345
wx2.appsecret = 23456
wx2.redirect_uri = https://www.yxjc123.com
配置文件类

package com.example.yxjc.props;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:wx.properties")
@ConfigurationProperties(prefix = "wx2")
public class WxProps2 {
    private String appkey;
    private String appsecret;
    private String redirect_uri;

    //getter and setter

    public String getAppkey() {
        return appkey;
    }

    public void setAppkey(String appkey) {
        this.appkey = appkey;
    }

    public String getAppsecret() {
        return appsecret;
    }

    public void setAppsecret(String appsecret) {
        this.appsecret = appsecret;
    }

    public String getRedirect_uri() {
        return redirect_uri;
    }

    public void setRedirect_uri(String redirect_uri) {
        this.redirect_uri = redirect_uri;
    }
} 

使用方法:

 import javax.annotation.Resource;


@RestController
public class PropsController {
    @Resource
    private WxProps2 wxProps2;

    @RequestMapping("/prop")
    public String prop() {
        return wxProps2.getAppkey();
    }
}

4. 使用 Environment 读取配置文件

该种方式是直接读取配置文件信息

例子:

@RestController
public class PropsController {
    @Autowired
    private Environment environment;

    @RequestMapping("/prop")
    public String prop() {
        return environment.getProperty("wx.appkey");
    }
}

总结

对于配置项目较少的情况或者是想简单一点直接使用@Value注解即可。

对于配置项较多且有分类的情况建议使用 @ConfigurationProperties 读取