SpringBoot笔记-01
配置文件
SpringBoot默认使用两种方式的全局配置文件,配置文件的名字是固定的
- application.properties
- application.yml
作用:用于修改SpringBoot自动配置的默认值
yaml
yaml的语法
YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
yaml与Json和Xml比起来更适合作为配置文件
server:
port: 8081
基本语法
key: value
冒号后面的空格不能少以空格缩进来控制层级关系,只要是左对齐的数据都是同一层级的
server: port: 8081 path: /hello
值的写法
字面量
字面量直接写即可,字符串不用加上单引号或者双引号
- 双引号:不会转义字符里面的特殊字符,特殊字符会作为本身想要表达的意思
- 单引号:会转义特殊字符,特殊字符最终只是一个普通的字符串数据
对象(属性和值),Map(键值对)
在下一行写对象的属性和值的关系,缩进要对齐
account: username: jack age: 20
行内写法:
account: {username: jack,age: 20}
数组(List,Set)
用
- 值
来表示其中的一个元素pets: - dog - cat
行内写法:
pets: [cat,dog]
配置文件值注入
导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
导入配置文件处理器后,以后编写配置就会有相应的提示
yaml
server: port: 8081 person: lastName: zhangsan age: 18 boss: false birth: 2017/12/13 maps: {k1: v1,k2: 12} lists: - lisi - liuwu dog: name: 小狗 age: 3
javaBean
package com.oylong.bean; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; import java.util.Map; @ConfigurationProperties(prefix = "person") @Component public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String, Object> maps; private List<Object> lists; private Dog dog; public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Boolean getBoss() { return boss; } public void setBoss(Boolean boss) { this.boss = boss; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public Map<String, Object> getMaps() { return maps; } public void setMaps(Map<String, Object> maps) { this.maps = maps; } public List<Object> getLists() { return lists; } public void setLists(List<Object> lists) { this.lists = lists; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } @Override public String toString() { return "Person{" + "lastName='" + lastName + '\'' + ", age=" + age + ", boss=" + boss + ", birth=" + birth + ", maps=" + maps + ", lists=" + lists + ", dog=" + dog + '}'; } }
@ConfigurationProperties
:告诉SpringBoot将本类中所有的属性和配置文件中相关的配置进行绑定@Componetn
:表示将此类加载到容器中
自动注入
Person
对象即可使用@SpringBootTest class SpringbootConfigApplicationTests { @Autowired Person person; @Test void contextLoads() { System.out.println(person); } }
properties配置文件
上述的yaml配置文件也可以使用properties配置文件来代替,如下
person.last-name=张三
person.age=20
person.birth=2019/10/10
person.boss=false
person.maps.k1=v1
person.maps.k2=20
person.lists=a,b,c,d,e
person.dog.name=dog
person.dog.age=10
但是输出后会有中文乱码的现象,需要在idea中设置propeties的编码,之后即可正常输出
不使用@ConfigurationProperties
注解来注入
我们也可以使用@Value
注解来注入
...
//@ConfigurationProperties(prefix = "person")
@Component
public class Person {
@Value("${person.last-name}")
private String lastName;
@Value("#{5*4}")
private Integer age;
@Value("true")
private Boolean boss;
private Date birth;
...
@Value
和@ConfigurationProperties
的区别
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个的制定 |
松散语法绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
- 松散语法: 用-小写或者_小写代替大写
- 如果只是在某个业务逻辑中需要获取某项值,使用
@Value
- 如果我们专门编写了一个javaBean来和配置文件进行映射,就直接使用
@ConfigurationProperties
读取指定的配置文件
- 我们可以使用
@PropertySource
注解来表示读取指定的某个配置文件
...
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
@Component
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
...
- 可以使用
@ImportResource
注解来导入Spring配置文件并让其生效
SpringBoot推荐的添加组件的方式:使用全注解的方式来配置
- 添加配置类,并且用
@Configuration
注解表示它是一个配置类 使用
@Bean
标签表示将方法的返回值添加到容器中,容器中这个组件默认id为方法名@Configuration public class MyConfig { @Bean public HelloService helloService() { return new HelloService(); } }
配置文件的占位符
随机数
${random.value}、${random.int}、${random.long} 2 ${random.int(10)}、${random.int[1024,65536]}
占位符获取之前配置的值可以使用:来指定
person.last‐name=张三${random.uuid} 2 person.age=${random.int} person.birth=2017/12/15 person.boss=false person.maps.k1=v1 person.maps.k2=14 person.lists=a,b,c person.dog.name=${person.hello:hello}_dog 9 person.dog.age=15
profile多环境支持
在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml 默认使用application.properties的配置
需要在主配置文件中激活配置,如有,application-dev.properties这个配置文件,则使用:
spring.profiles.active=dev
若使用yaml,则可以使用多文档块,使用---来分隔,如下
spring: profiles: active: dev --- server: port: 8081 --- spring: profiles: prod server: port: 8080
使用命令行
添加参数
spring.profiles.active=dev
运行即可
配置文件加载位置
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
- 可以通过spring.config.location来改变默认的配置文件位置