日常工作中,我们需要把外部配置文件引入项目,不管是从apollo还是配置文件中拉取配置项,使用相应的注解都是最简洁的方法,现在总结一下相应的用法
演示功能
1.@Value的用法
2.@PropertySource加载外部配置文件
3.通过environment获取外部配置的值
# @Value的用法和@PropertySource加载外部配置文件的演练
@Value修饰成员变量的用法总结
注入字符串
注入表达式计算结果
注入操作系统
注入函数表达式
注入URL表达式
注入自己(bean)的属性
注入其他bean的属性
注入文件资源
注入字符串表达式结果
注入外部配置文件字符串的表达式结果
实例:
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Worker implements Serializable {
private static final long serialVersionUID = 7387479910468805194L;
@Value("roy")
private String name;
@Value("#{20-2}")
private Integer age;
@Value("#{systemProperties['os.name']}")
private String systemPropertiesName;
@Value("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber; //注入表达式结果
@Value("http://www.baidu.com")
private Resource url; // 注入URL资源
// 注入其他Bean属性:注入person对象的属性name,注入的是自己的name值
@Value("#{worker.name}")
private String nikeName;
@Value("#{person.name}")
private String psersonName;
@Value("${teacher.name}")
private String teacherName;
@Value("classpath:teacher.properties")
private Resource resourceFile; // 注入文件资源
// SpEL:调用字符串Hello World的concat方法,连接字符串
@Value("#{'Hello World'.concat('!')}")
private String helloWorld;
// SpEL: 调用字符串的getBytes方法,然后调用length属性
@Value("#{'Hello World'.bytes.length}")
private String helloWorldbytes;
@Value("#{'${server.name}'.split(',')}")
private List<String> servers;
}
外部配置文件teacher.properties
teacher.name=roy
teacher.age=20
teacher.nickName=yawu
server.name=roy,jack,henghui
配置项:
使用@PropertySource加载配置文件
@Configuration
@PropertySource(value = {"classpath:teacher.properties"})
public class PropertyValueConfig {
@Bean
public Worker worker(){
return new Worker();
}
@Bean
public Person person(){
Person person = new Person();
person.setName("jack");
return person;
}
}
测试类:
/**
* 测试bean的@value注入 ,注入字符串和表达式 Worker(name=roy, age=18, systemPropertiesName=Windows 10,
* randomNumber=14.869541521378205, url=URL [http://www.baidu.com])
*/
@Test
public void testPropertyValue() {
// 创建IOC容器
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(PropertyValueConfig.class);
String[] names = context.getBeanDefinitionNames();
Arrays.stream(names).forEach(System.out::println);
System.out.println("================================");
Worker worker = (Worker) context.getBean("worker");
System.out.println(worker);
}
测试结果:
Worker(name=roy, age=18, systemPropertiesName=Mac OS X, randomNumber=95.83436254541576, url=URL [http://www.baidu.com], nikeName=roy, psersonName=jack, teacherName=roy, resourceFile=class path resource [teacher.properties], helloWorld=Hello World!, helloWorldbytes=11, servers=[roy, jack, henghui])
通过environment获取外部配置的值
注入外部属性值的bean:
/** description: author:dingyawu date:created in 23:21 2020/12/6 history: */
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Teacher implements Serializable {
private static final long serialVersionUID = 7387479910468805194L;
@Value("${teacher.name}")
private String name;
@Value("${teacher.age}")
private Integer age;
@Value("${teacher.nickName}")
private String nickName;
public void init() {
System.out.println("init。。。。。。。。。");
}
public void destroy() {
System.out.println("destroy。。。。。。。。。");
}
}
配置类:
/**
* description:
* author:dingyawu
* date:created in 23:26 2020/12/6
* history:
*/
@PropertySource(value = {"classpath:teacher.properties"})
@Configuration
public class TeacherValueConfig {
@Bean
public Teacher teacher(){
return new Teacher();
}
}
测试类:
/** 通过environment获取属性值 */
@Test
public void testPropertyValue03() {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(TeacherValueConfig.class);
Environment environment = context.getEnvironment();
String nickName = environment.getProperty("teacher.nickName");
System.out.println(nickName);
}