3.2 注入配置文件
yaml更强大的地方在于,可以给实体类直接注入匹配值!
yaml注入配置文件
-
在springboot项目中的resources目录下新建application.yml
-
编写一个实体类 Dog
@Component public class Dog { private String name; private Integer age; }
-
思考:原来怎么给bean注入属性值,@Value
@Component public class Dog { @Value("旺财") private String name; @Value("3") private Integer age; }
-
在SpringBoot的测试类下注入输出
@SpringBootTest class Springboot02ConfigApplicationTests { @Autowired private Dog dog; @Test void contextLoads() { System.out.println(dog); } }
-
再编写一个复杂一点的实体类:Person类
@Component public class Person { private String name; private Integer age; private boolean happy; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog; }
-
使用yaml配置的方式进行注入,注意区别和优势
person: name: huba age: 22 happy: false birth: 2020/8/11 maps: {k1: v1,k2: v2} lists: -code -music dog: name: 旺财 age: 3
-
我们现在来注入到类中
@Component @ConfigurationProperties(prefix = "person") public class Person { ... }
-
IDEA提示,springboot配置注解处理器没有找到,我们可以查看文档,找到一个依赖!
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
-
确认以上配置都ok之后,去测试类中测试一下
加载指定的配置文件
@PropertySource:加载指定的配置文件
;
@ConfigurationProperties:默认从全局配置文件
中获取值;
-
在resources下新建一个
person.properties
name=huba
-
在实体类上指定加载
person.properties
文件@PropertySource(value="classpath:person.properties") // EL表达式取值 @Value("${name}")
-
输出测试:指定配置文件绑定成功!
配置文件占位符
配置文件还可以编写占位符生成随机数
person:
name: huba${random.uuid}
age: ${random.int}
happy: false
birth: 2020/8/11
maps: {k1: v1,k2: v2}
lists:
-code
-music
dog:
name: ${person.hello:huba}_旺财
age: 3
测试输出结果:
对比小结
@Configuration
只需要写一次即可,@Value
则每个字段都需要;- 松散绑定:yml中的last-name,这个和lastName是等价的,-后面的字母默认是大写的;
- JSR303数据校验,它就是在字段增加一层过滤器验证,可以保证数据的合法性;
- 复杂类型封装,yml可以封装对象;
结论:
- 推荐yml
- 如果只需要获取配置文件的某个值,可以使用@Value
- 如果专门编写一个JavaBean来和配置文件一一映射,就直接@ConfigurationProperties,不要犹豫!