environment 主要是用来加载系统配置环境变量以及用户自定义的键值对
测试代码
package oilprice;
import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.BeanExpressionContext;
import org.springframework.beans.factory.config.DependencyDescriptor;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.expression.StandardBeanExpressionResolver;
import org.springframework.core.env.Environment;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.ResourcePropertySource;
/**
* @author micro.cloud.fly
* @date 2022/7/15 2:37 下午
* @desc
*/
public class TestReadProperties {
public static void main(String[] args) throws Exception {
//1)获得@Value的值
System.out.println("=======================> 仅获取@Value值");
QualifierAnnotationAutowireCandidateResolver resolver = new QualifierAnnotationAutowireCandidateResolver();
Object name = resolver.getSuggestedValue(new DependencyDescriptor(Bean1.class.getDeclaredField("name"), false));
System.out.println("name:"+name);
Object address = resolver.getSuggestedValue(new DependencyDescriptor(Bean1.class.getDeclaredField("address"), false));
System.out.println("address 注解值:"+name);
System.out.println("实际值:"+getEnvironment().resolvePlaceholders(address.toString()));
//2)解析@Value的值
System.out.println("=======================> 获取 @Value值,并解析${}");
Object javaHome = resolver.getSuggestedValue(new DependencyDescriptor(Bean1.class.getDeclaredField("javaHome"), false));
System.out.println("javaHome:"+javaHome);
//解析系统环境变量
Environment environment = getEnvironment();
String s = environment.resolvePlaceholders(javaHome.toString());
System.out.println("s:"+s);
//3)解析 SpEL 表达式
System.out.println("=======================> 获取 @Value 值,并解析#{}");
Object expression = resolver.getSuggestedValue(new DependencyDescriptor(Bean1.class.getDeclaredField("expression"), false));
System.out.println("expression:"+expression);
//先解析${java.class.version}
String s1 = environment.resolvePlaceholders(expression.toString());
System.out.println("s1:"+s1);
//再解析SpEL表达式
Object evaluate = new StandardBeanExpressionResolver().evaluate(s1, new BeanExpressionContext(new DefaultListableBeanFactory(), null));
System.out.println(evaluate);
}
private static Environment getEnvironment() throws Exception {
StandardEnvironment env = new StandardEnvironment();
//默认加载的系统变量与Java系统的值,自定义的需要通过加载文件获取
env.getPropertySources().addLast(new ResourcePropertySource("xiaoyang", new ClassPathResource("xiaoyang.properties")));
return env;
}
static class Bean1 {
@Value("hello")
private String name;
@Value("${address}")
private String address;
@Value("${JAVA_HOME}")
private String javaHome;
@Value("#{'class version:' + '${java.class.version}'}")
private String expression;
}
}
xiaoyang.properties
name=yaoming
age=12
address=jiangsu_suzhou