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不支持复杂数据类型封装
