SpringBoot读取配置文件以及@ConfigurationProperties和@Value区别01
1.springboot自动配置原理
springboot在启动的时候从类路径下META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作,以前我们需要自己配置的,自动类都帮我们配置
Resources文件夹中目录结构:
static:保存所有的静态资源:js,css,image
templates:保存所有的模板页面
获取SpringBoot的配置文件:
YAML语法:
1、基本语法
K:(空格)V:表示一对键值对(空格必须有)
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级
2.值的写法
字面量:普通的数(数字,字符串,布尔)
字符串默认不加单引号或者双引号
“”双引号不会转义字符串里面的特殊字符,特殊字符会作为本身要表达的意思
‘’单引号会转义,特殊字符最终只是一个普通的字符串数据
对象、Map(属性和值)
数组(List,Set)
用-值表示数组中的一个元素
示例:使用yml配置
配置文件写法
为了为了让写入的配置文件有提示:导入官方提示的jar包
<!--导入配置文件处理器,配置文件进行绑定就会有提示--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
JavaBean Person
@ConfigurationProperties配置文件默认写在全局的 @propertySources(value={“calsspath:person.properties”})读取指定的配置文件
test包里测试
@RunWith(SpringRunner.class)爆红,导入jar包
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
测试类
@SpringBootTest @RunWith(SpringRunner.class) class SpringBootConfigApplicationTests { @Autowired Person person; @Test void contextLoads() { System.out.println(person); } }
使用properties配置
person.name=张三 person.age=18 person.birth=2017/12/15 person.boss=false person.maps.k1=v1 person.maps.k2=v2 person.list=a,b,c person.dog.name=dog person.dog.age=15
修改properties文件的编码格式为utf-8
2.获取配置文件值的第二种方式
使用@Value获取值
/** * <bean class="Person"> * <property name="lastName" value="字面量/${key}从环境变量,配置文件 * 中获取值"/#{spring 的el表达式}></property> * </bean> */ @Component /*@ConfigurationProperties(prefix = "person")*/ public class Person { @Value("${person.name}") private String name; @Value("#{11*2}") private Integer age; @Value("true") private boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> list; private Dog dog;
@Value获取值和@ConfigurationProperties为属性注入值对比
@ConfigurationProperties | @Value | |
功能 | 批量注入配置文件属性 | 一个一个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
Spring的EL表达式 #{} | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
如果说我们只是在某个业务逻辑中获取一个配置文件中的某项值,使用@Value,比如
@RestController public class HelloController { @Value("#{person.name}") private String name; @RequestMapping("/hello") public String getName(){ return "hello"+name; } }
如果我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
JSR303数据校验:使用@Validated,要求参数必须为@Email格式,@Value不支持参数校验,校验无效
这个就是松散结构,他们等价
@Value不支持复杂数据类型封装