有个需求是
将配置文件中的属性放置到系统环境变量中,可以使用System.get获取到;
这个时候使用EnvironmentAware最是方便;原因是:
- 所有的配置信息,都会加载到Environment实体中,因此我们可以通过这个对象来获取系统的配置,通过这种方式不仅可以获取application.yml配置信息,还可以获取更多的系统信息;
- 凡是被Spring管理的类,实现接口 EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的变量。
使用Vaule注解也可以获取到配置中的属性
代码如下:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
@Configuration
public class MyEnvironmentAware implements EnvironmentAware {
@Value("${web..url}")
String webUrl;
@Value("${user.name}")
String userName;
@Value("${user.password}")
String password;
@Override
public void setEnvironment(Environment environment) {
System.out.println(webUrl);
System.out.println(environment.getProperty("web.url"));
System.out.println(System.setProperty("web.url",webUrl));
}
}
关于Environment
Environment表示整个应用运行时的环境即Spring应用所处的环境。
Environment在容器中是一个抽象的集合,是指应用环境的2个方面:profiles和properties。
profile配置是一个被命名的、bean定义的逻辑组,这些bean只有在给定的profile配置激活时才会注册到容器。Environment环境对象的作用,对于profiles配置来说,它能决定当前激活的是哪个profile配置,和哪个profile是默认。
只有当一个profile处于active状态时,它对应的逻辑上组织在一起的这些Bean定义才会被注册到容器中。properties属性可能来源于properties文件、JVM properties、system环境变量、JNDI、servlet context parameters上下文参数、专门的properties对象,Maps等等。Environment对象的作用,对于properties来说,是提供给用户方便的服务接口、方便撰写配置、方便解析配置。
- 绝大数情况下,bean都不需要直接访问Environment对象,而是通过类似@Value注解的方式把属性值注入进来。