配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的;有以下两种配置:
•application.properties
•application.yml (YAML)
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
xxxx.xml文件;以数据为中心,比json、xml等更适合做配置文件;
YAML:配置例子
server: port: 8081
properties:配置例子
server.port=8081
XML:配置例子
<server> <port>8081</port> </server>
1.YAML基本语法
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
2.YAML配置中值的写法
①字面量:普通的值(数字、字符串、布尔)
字符串默认不用加上单引号或者双引号;
"":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
'':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
②对象、Map (键值对)
对象还是k: v的方式
friends: lastName: zhangsan age: 20
另外的一种行内写法
friends: {lastName: zhangsan,age: 18}
③数组
用- 值表示数组中的一个元素
animals: - cat - dog - pig
另一种行内写法
animals: [cat,dog,pig]
3.将YAML配置文件中的值注入到对象中
bean对象
/** * Created by wangxiaodong on 2018/6/8. * @ConfigurationProperties注解注入属性的时候一定要提供set方法 * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定; * prefix = "person":配置文件中person下面的所有属性进行一一映射 * @Component将组件注入到容器中 * 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能; * @Validated 开启数据校验 只有@ConfigurationProperties批量注入属性的时候才能生效 */ @Component @ConfigurationProperties(prefix = "person") @Validated public class Person { @Email // @Value("${person.lastName}") //不支持数据校验 不是电子邮件格式也可以 private String lastName; private Integer age; private boolean boss; private Date birth; // @Value("${person.lists}") 可以注入list private List<Object> lists; // @Value("${person.maps}") 无法注入map private Map<String, Object> maps; private Dog dog; }
public class Dog { private String name; private Integer age; }
YAML配置文件
person: lastName: 王晓东 age: 28 boss: false birth: 1989/10/24 lists: - lisi - 陈老六 maps: {k1: v1,k2: 东东,k3: 68} dog: name: 奥斯卡 age: 2
properties配置文件
person.lastName=张三 person.age=18 person.boos=true person.birth=1989/10/24 person.lists=a,b,c ######person.maps={k1:v1,k2:三三,k3:18} 这是错误的注入方法 person.maps.k1=v1 person.maps.k2=三三 person.maps.k3=18 person.dog.name=奥斯卡 person.dog.age=2
我们可以导入配置文件处理器,以后编写配置就有提示了
<!--导入配置文件处理器,配置文件进行绑定就会有提示--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
我们执行test测试类
/** * SpringBoot单元测试 * 可以在测试期间很方便的类似编码一样进行自动注入到容器的功能 */ @RunWith(SpringRunner.class) //用Spring的单元测试驱动器来跑 而不是用Junit @SpringBootTest public class SpringBootQuickApplicationTests { @Autowired Person person; @Test public void contextLoads() { System.out.println(person); } }
4.@Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value(无需提供get/set方法也可以注入) | |
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 (last-name 对 lastname lastName都能绑定) | 不支持 |
SpEL | 不支持 | 支持 #{10*2} |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 ${person.maps}无法获取到多个键值对 |
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
5.配置文件注入值数据校验
@Component @ConfigurationProperties(prefix = "person") @Validated public class Person { @Email // @Value("${person.lastName}") //不支持数据校验 不是电子邮件格式也可以 private String lastName; private Integer age; private boolean boss; private Date birth; // @Value("${person.lists}") 可以注入list private List<Object> lists; // @Value("${person.maps}") 无法注入map private Map<String, Object> maps; private Dog dog; }
PropertySource:加载指定的配置文件;
@PropertySource(value = {"classpath:person.properties","classpath:dog.properties"}) @Component @ConfigurationProperties(prefix = "person") @Validated public class Person { @Email // @Value("${person.lastName}") //不支持数据校验 不是电子邮件格式也可以 private String lastName; private Integer age; private boolean boss; private Date birth; // @Value("${person.lists}") 可以注入list private List<Object> lists; // @Value("${person.maps}") 无法注入map private Map<String, Object> maps; private Dog dog }
ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
①需要spring配置文件注入的类(此处不用注解注入)
public class HelloWorldService { }
②spring的xml配置文件注入此bean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id = "helloWorldService" class="com.example.service.HelloWorldService"></bean> </beans>
③配置类上加上ImportResource注解 引入Spring的配置文件
@ImportResource(locations = {"classpath:beans.xml"}) @SpringBootApplication public class SpringBootQuickApplication { public static void main(String[] args) { SpringApplication.run(SpringBootQuickApplication.class, args); System.out.println("Spring Boot started... ..."); } }
④测试类测试是否获取bean
@RunWith(SpringRunner.class) //用Spring的单元测试驱动器来跑 而不是用Junit @SpringBootTest public class SpringBootQuickApplicationTests { @Autowired HelloWorldService helloWorldService; @Test public void testSpringXML() { System.out.println(helloWorldService); System.out.println("####################################################################"); } }
SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式,而不是ImportResource配置文件,即:
package com.example.config; import com.example.service.HelloWorldManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Created by wangxiaodong on 2018/6/ * @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件 * 在配置文件中我们是用<bean><bean/>标签添加组件 注解的方式就是@Bean */ @Configuration public class MyAppConfig { //将方法的返回值添加到容器中;容器中这个组件默认的bean的id就是方法名:helloWorldManager @Bean public HelloWorldManager helloWorldManager(){ return new HelloWorldManager(); } }②测试
@RunWith(SpringRunner.class) //用Spring的单元测试驱动器来跑 而不是用Junit @SpringBootTest public class SpringBootQuickApplicationTests { @Autowired ApplicationContext ioc; // @Autowired // HelloWorldManager helloWorldManager; @Test public void testSpringXML() { //此处bean的id : helloWorldManager 为配置类中返回此对象方法的方法名 HelloWorldManager helloWorldManager = (HelloWorldManager)ioc.getBean("helloWorldManager"); System.out.println(helloWorldManager); System.out.println("####################################################################"); } }
properties配置文件占位符
①随机数
${random.value}、${random.int}、${random.long} ${random.int(10)}、${random.int[1024,65536]}
②占位符也可以获取之前的配置,如果没有可以使用 :指定默认值
[email protected] person.age=${random.int} person.boos=true person.birth=1989/10/24 person.lists=a,b,c person.maps.k1=v1 person.maps.k2=${random.uuid} person.maps.k3=${random.value} person.dog.name=${dog.name:奥斯卡} person.dog.age=2 dog.name=大黑