24. Spring Boot环境变量读取和属性对象的绑定【从零开始学Spring Boot】
凡是被Spring管理的类,实现接口EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的变量。
com.kfit.environment.MyEnvironmentAware :
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就能获取到系统环境信息;
*
* @authorAngel(QQ:412887952)
* @version v.0.1
*/
@Configuration
public class MyEnvironmentAware implements EnvironmentAware{
//注入application.properties的属性到指定变量中.
@Value("${spring.datasource.url}")
private String myUrl;
/**
*注意重写的方法 setEnvironment是在系统启动的时候被执行。
*/
@Override
public voidsetEnvironment(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."的属性列表值.
RelaxedPropertyResolverrelaxedPropertyResolver = 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
public classPageControllerimplementsEnvironmentAware{
@Override
public void setEnvironment(Environmentenvironment) {
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 Stringhost;
privateint port= DBPort.PORT;
private Stringuri = "mongodb://localhost/test";
private Stringdatabase;
// ... getters/ setters omitted
}
它就是以spring.data.mongodb作为前缀的属性,然后通过名字直接映射为对象的属性,同时还包含了一些默认值。如果不配置,那么mongo.uri就是mongodb://localhost/test。
以上这个配置需要加入依赖:
<!--spring-boot-configuration:springboot配置处理器; -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
购买完整视频,请前往:http://www.mark-to-win.com/TeacherV2.html?id=287