??@Value注入变量用于从SpringBoot项目Environment对象中获取变量值,Environment 对象中的变量来源于配置文件,程序启动参数、JVM环境变量、操作系统环境变量。程序启动参数与配置文件中定义了相同的变量时,程序启动参数将会覆盖配置文件中变量的值。
@Value("${gateway.whitelist}")
private String[] whiteList;
??从配置文件中获取变量值,如在 application.properties
、bootstrap.yml
等定义好环境变量后,程序中可通过 @Value 注入变量的方式获取变量值。例如在 application.properties 中定义变量:
gateway.whitelist=/abc,/def
??如果在JVM环境变量、操作系统环境变量、配置文件,程序启动参数中定义了相同的变量名,变量值的优先级是:JVM环境变量 > 程序启动参数 > 操作系统环境变量 > 配置文件参数
??System.getenv() 是 Java 内置方法,用于获取操作系统环境变量。
String password = System.getProperty("jasypt_encryptor_password");
??获取操作系统环境变量,采用这种方式获取 jasypt_encryptor_password
变量的值,一定要将这个变量在操作系统环境变量中定义,如果这个变量在 application.properties
、bootstrap.yml
中定义则将无法被获取。
??在操作系统中定义环境变量时,变量名中不能有 .
号,例如 jasypt.encryptor.password
不能设置成操作系统的环境变量。可以使用 _
来代替 .
号。
??System.getProperty() 是Java 内置方法,用于获取JVM环境变量。
String password = System.getProperty("jasypt.encryptor.password");
??获取JVM环境中的变量值,需要在JVM环境中定义 jasypt.encryptor.password
。通过 java -jar
启动 spring boot 程序时,可通过使用 -Djasypt.encryptor.password=xxx
的方式设置JVM环境中的变量,示例如下:
java -jar -Djasypt.encryptor.password=xxx demo.jar
??从SpringBoot项目Environment对象中获取变量值,Environment 对象中的变量来源于配置文件,程序启动参数、JVM环境变量、操作系统环境变量。程序启动参数与配置文件中定义了相同的变量时,程序启动参数将会覆盖配置文件中变量的值。
@Autowired
private Environment environment;
String password = environment.getProperty("jasypt.encryptor.password");
??如果操作系统环境变量中定义了 jasypt_encryptor_password
变量,则变量值为操作系统环境变量中的值,如果操作系统环境变量中未定义这个变量,则从配置文件(application.properties
、bootstrap.yml
)中获取变量值。假设 bootstrap.yml 中定义了
jasypt:
encryptor:
password: 123456789
通过 environment.getProperty("jasypt.encryptor.password")
将会获取到变量的值为 123456789。
??如果在JVM环境变量、操作系统环境变量、配置文件,程序启动参数中定义了相同的变量名,变量值的优先级是:JVM环境变量 > 程序启动参数 > 操作系统环境变量 > 配置文件参数
@Configuration
@ConfigurationProperties(prefix = "demo.kv")
@Data
public class AppSecurity {
private Map<String, String> apps;
}
??从配置文件(application.properties
、bootstrap.yml
)中获取变量。在 bootstrap.yml 中定义变量:
demo:
kv:
apps:
key111: 1230678913234
key112: 12306789fdfdf4
public static void main(String[] args) {
SpringApplication.run(BootstrapApplication.class, args);
for (String arg : args) {
System.out.println(arg);
}
}
// output: --demo.name=abc
??程序启动参数变量是程序启动时传入的变量. java -jar
启动程序时使用 --
传入程序启动参数变量。例如在程序启动时,传入 demo.name
的变量:
java -jar demo.jar --demo.name=abc
??采用这种方式定义变量后,这些参数会被添加到 Environment 环境变量中,如果在配置文件中已经定义了 demo.name
变量,则通过 --demo.name
变量将会覆盖之前在配置文件中定义的变量值。例如:application.properties
中配置信息是:
demo.name=hello
??程序启动时使用 java -jar demo.jar --demo.name=abc
启动程序,在程序中使用 Environment 对象获取 demo.name
变量时,获取到的值是:abc