首页 二、配置文件(Spring Boot教程笔记3)
文章
取消

二、配置文件(Spring Boot教程笔记3)

二、配置文件

1、配置文件

全局配置文件(/src/main/resources/):

  • application.properties

  • application.yml

    YAML:和json和xml一样的配置文件,但比他们更合适做配置文件。

1
2
3
  # 例子:
  server:
    port: 8081

2、YAML 语法

1.基本语法

key:(空格)value:表示一对键值对(一定要有空格)。

空格 的缩进来控制层级关系,左对齐的一列数据都是同一层级的。

属性和值都是大小写敏感的。

1
2
3
server:
  port: 8081
  path: /hello

2.值的写法

  • 字面量:

    字符串默认不用加上单引号和双引号。

    “”:双引号不会转义字符串里面的特殊字符。

    ‘’:单引号会转义。

  • 对象、Map(属性和值)(键值对):

    key: value:在下一行来写对象的属性和值的关系,注意缩进。

1
2
3
  friends:
    lastName: zhangshan
    age: 20

行内写法:

1
  friends: {lastName: zhangshan,age: 18}
  • 数组(List, set)

1
2
3
4
  pets:
   - cat
   - dog
   - pig

行内写法:

1
  pets: [cat,dog,pig]

3.配置文件值注入

1. 配置文件内容(application.yml):

1
2
3
4
5
6
7
8
9
10
11
12
13
# application.yml
person:
  lastName: zhangshan
  age: 23
  boss: false
  birth: 2017/3/2
  maps: {k1: v1,k2: 23}
  lists:
   - lisi
   - zhaoliu
  dog:
   name: 小狗
   age: 2

2. javaBean:

目录层级结构:

—-com.jim

+—- bean

+—+—- Dog // 因为Person里面有个Dog对象

+—+—- Person

+—- MainApplition.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// /src/main/java/com/jim/bean/Person.java
/**
 * 将配置文件中配置的每一个属性的值,都映射到这个组件中。
 * @CongigurationProperties: 告诉SpringBoot将本类中的所有属性与配置文件相关配置进行绑定。
 *      prefix = "person": 配置文件中哪个下面的所有属性进行一一映射
 * 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能,故还要加上@Component
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Date birth;
    private Boolean boss;
    private Map<String, Object> maps;
    private List<Object> lists;
    private Dog dog;

在IDEA中,Alt+Insert可以快速添加set/get方法和toSring方法。

3. 在pom.xml中添加配置文件处理器(添加依赖),才能让配置文件与类进行绑定:

1
2
3
4
5
6
       <!--配置文件处理器,将配置文件与类进行绑定-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

4. 目录结构:

1532170206750

5. 测试类

  1. 目录结构

    1532170349436

  2. SpringBoot单元测试,可以在测试期间很方便的类似编码一样进行自动注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   // /src/test/java/com/jim/MainApplicationTests.java
   package com.jim;
   import org.junit.runner.RunWith;
   import org.springframework.boot.test.context.SpringBootTest;
   import org.springframework.test.context.junit4.SpringRunner;
   @RunWith(SpringRunner.class) // 告诉Spring用SpringRunner引擎启动
   @SpringBootTest // 告诉Spring这是SpringBoot测试用的
   public class HelloWorldMainApplicationTests {
       @Autowired // 1. 将person注入进来,我们要测试person是什么东西
       Person person;
       @Test
       public void contentLoads() {
           System.out.println(person); // 2. 在控制台将person打印出来
       }   // System.out.println()在IDEA中快捷键是sout
   }

如果写RunWith或SpringBootTest或SpringRunner提示没有这个,那就是说没有注入进来,按Alt+Enter让Spring自己导入进来(它自己会添加依赖,然后将包导入进来)。

6. 用application.properties做配置

1
2
3
4
5
6
7
8
9
# 配置person的值
person.last-name=zhangshan # last-name == lastName
person.age=23
person.birth=2017/2/13
person.maps.k1=v1
person.maps.k2=21
person.lists=a,b,c
person.dog.name=小狗
person.dog.age=2

注:(解决中文乱码)SpringBoot默认将application.properties用ascii编码,而IDEA用utf-8将application.properties编码,故在IDEA中 File –> settings –> Editor –> File Encoding –> Properties Files(*.properties) , 将文件编码弄成utf-8并打钩。

1532171968061

7.用@Value()注入,从配置文件获取值

1
2
3
4
5
6
7
8
9
// @ConfigurationProperties()和@Value()两种注入方法二选一,下面选了@Value()方法,故需要将@ConfigurationProperties()注释掉
// @ConfigurationProperties(prefix = "person") 
public class Person {
    @Value("${person.last-name}") // 将配置文件中的person.last-name值赋给lastName
    private String lastName;
    @Value("#{11*2}") // #{}是Spring的表达,#{} = ${}
    private Integer age;
    @Value("true")
    private Boolean boss;

8.@Value()和@ConfigurationProperties()两者获取配置文件的值比较

 @ConfigurationProperties()@Value()
功能批量注入配置文件中的属性需要一个个指定
松散绑定(松散语法)支持不支持
SpEL不支持支持
JSR303支持不支持
复杂类型封装(Map, List, 对象)支持不支持,只能取出基本类型数据
  • 松散绑定:譬如,认为lastName==last-name是一样的为支持松散绑定,反之不支持。

  • SpEL:譬如,@Value(“#{11*2}”),Spring是可以算出值出来的,但是如果你在配置文件里写上:person.age=#{11*2}就会报错,所以@ConfigurationProperties()不支持SpEL。

  • JSR303数据校验:

1
2
3
4
5
6
  // @ConfigurationProperties(prefix = "person")
  @Validated
  public class Person {
      //@Value("${person.last-name}")
      @Email
      private String lastName;
  • @Validated表明这个类需要校验,@Email是lastName的一个检验规则(lastName是否为一个邮箱格式)

  • 只有@ConfigutationProperties()支持数据检验

1
2
3
4
5
    @ConfigurationProperties(prefix = "person")
    @Validated
    public class Person {
        @Email
        private String email;

如果说我们只是在业务逻辑中需要获取一下配置文件的某项值,不需要将配置文件的某一个大类全部导入,那么就用@Value()。

如果我们专门写了一个可重用组件(Java里叫JavaBean)来和配置文件进行映射,就直接使用@ConfigurationProperties(),就像和数据库连接取数据一样。

9.@PropertySource和@ImportResource

​ 1. @ConfigutationProperties()只能将全局配置文件(application.properties或者application.yml)将类进行绑定,而@PropertySource能加载指定的配置文件。

1
2
3
4
5
// /src/main/java/com/jim/bean/Person.java
@Component
// @ConfigurationProperties(prefix = "person")
@PropertySource(value = {"classpath:person.properties"})
public class Person {

​ 配置文件在resources里:person.propeties。

1
2
3
4
5
6
7
8
9
# /src/main/resources/person.properties
person.last-name=zhangshan
person.age=23
person.birth=2017/2/13
person.maps.k1=v1
person.maps.k2=21
person.lists=a,b,c
person.dog.name=小狗
person.dog.age=2

​ 2. @ImportResource()

1
2
3
4
// /src/main/java/com/jim/HelloMain.java
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class HelloMain {

​ beans.xml是我们自定义的一个Spring配置文件,放在resources下,我们想让它导入进来并生效,得在一个配置类上标注@ImportResource(locations = {“classpath:beans.xml”}),上述例子是标注在主程序(主配置类)上。

  1. SpringBoot推荐给容器添加组件的方式是采用全注解,即配置类==Spring自定义配置文件,使用@Bean给容器中添加组件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    // /src/main/java/com/jim/config/MyAppConfig.java
    package com.jim.config;
    import com.jim.service.HelloService;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    /**
     * @Configutation: 指明当前类是一个配置类,能替代之前的自定义的Spring配置文件
     */
    @Configuration
    public class MyAppConfig {
        // 将方法的返回值添加到Spring容器中,容器中的HelloService组件默认的id就是方法名helloService
        @Bean
        public HelloService helloService() {
            // 如果容器中有HelloService这个组件,那就能new,返回true
            return new HelloService();
        }
    }
1
2
3
* 这是自定义的一个配置类:com.jim.config.MyAppConfig.java。

* **将一个组件添加到Sping中,譬如,我有个组件service下的HelloService组件,那么,我就要在我的MyAppConfig配置类里写上一个方法,这个方法要有@Bean标注,因为这个标注能将该方法的返回值添加到Spring容器中,这样,我只要在该方法中return new HelloService();就好了。**

1532195706379