其实获取系统变量有一种非常简单的方法,直接一行代码搞定,代码为:
System.getenv().get("JAVA_HOME")
咱们这里介绍凡是被spring管理的类,实现接口 EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的变量。
package com.kfit.environment; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; /** * 主要是@Configuration,实现接口:EnvironmentAware就能获取到系统环境信息; * * */ @Configuration public class MyEnvironmentAware implements EnvironmentAware{ //注入application.properties的属性到指定变量中. @Value("${spring.datasource.url}") private String myUrl; /** *注意重写的方法 setEnvironment 是在系统启动的时候被执行。 */ @Override public void setEnvironment(Environment environment) { //打印注入的属性信息. System.out.println("myUrl="+myUrl); //通过 environment 获取到系统属性. System.out.println(environment.getProperty("JAVA_HOME")); //通过 environment 同样能获取到application.properties配置的属性. System.out.println(environment.getProperty("spring.datasource.url")); //获取到前缀是"spring.datasource." 的属性列表值. RelaxedPropertyResolver relaxedPropertyResolver = new RelaxedPropertyResolver(environment, "spring.datasource."); System.out.println("spring.datasource.url="+relaxedPropertyResolver.getProperty("url")); System.out.println("spring.datasource.driverClassName="+relaxedPropertyResolver.getProperty("driverClassName")); } }
其中application.properties文件信息是:
######################################################## ###datasource ######################################################## spring.datasource.url = jdbc:mysql://localhost:3306/test spring.datasource.username = root spring.datasource.password = root spring.datasource.driverClassName = com.mysql.jdbc.Driver spring.datasource.max-active=20 spring.datasource.max-idle=8 spring.datasource.min-idle=8 spring.datasource.initial-size=10
@Controller @Service 等被Spring管理的类都支持,注意重写的方法 setEnvironment 是在系统启动的时候被执行。
或者如下Controller:
@Controller publicclassPageControllerimplementsEnvironmentAware{ @Override publicvoid setEnvironment(Environment environment) { String s = environment.getProperty("JAVA_HOME"); System.out.println(s); } }
我们还可以通过@ConfigurationProperties 读取application属性配置文件中的属性。
Configuration @ConditionalOnClass(Mongo.class) @EnableConfigurationProperties(MongoProperties.class) publicclassMongoAutoConfiguration { @Autowired private MongoProperties properties; }
· @ConditionOnClass表明该@Configuration仅仅在一定条件下才会被加载,这里的条件是Mongo.class位于类路径上
· @EnableConfigurationProperties将Spring Boot的配置文件(application.properties)中的spring.data.mongodb.*属性映射为MongoProperties并注入到MongoAutoConfiguration中。
· @ConditionalOnMissingBean说明Spring Boot仅仅在当前上下文中不存在Mongo对象时,才会实例化一个Bean。这个逻辑也体现了Spring Boot的另外一个特性——自定义的Bean优先于框架的默认配置,我们如果显式的在业务代码中定义了一个Mongo对象,那么Spring Boot就不再创建。
@ConfigurationProperties(prefix = "spring.data.mongodb") publicclass MongoProperties { private String host; privateint port = DBPort.PORT; private String uri = "mongodb://localhost/test"; private String database; // ... getters/ setters omitted }
它就是以spring.data.mongodb作为前缀的属性,然后通过名字直接映射为对象的属性,同时还包含了一些默认值。如果不配置,那么mongo.uri就是mongodb://localhost/test。
以上这个配置需要加入依赖:
<!--spring-boot-configuration:spring boot 配置处理器; --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程