1. 程式人生 > >SpingBoot之配置文件的值註入問題

SpingBoot之配置文件的值註入問題

必須 cati ring focus service() 實體 path ann img

我們在這裏研究的是以yml配置文件值註入的問題:

Person:
    lastName: 張三
    age: 23
    boss: false
    birth: 2018-10-11
    maps: {k1: v1,k2: v2}
    lists:
      - pig
      - dog
    dog:
      name: 半半
      age: 1

定義了一個Person的實體類:

package com.example.demo.entity;
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:告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定 * prefix = "person" 配置文件中哪些下面的所有屬性進行一一映射 * 只有這個組件是容器中的組件才能使用容器提供的@ConfigurationProperties的功能
*/ @Component @ConfigurationProperties(prefix = "person") 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; @Override
public String toString() { return "Person{" + "lastName=‘" + lastName + ‘\‘‘ + ", age=" + age + ", boss=" + boss + ", birth=" + birth + ", maps=" + maps + ", lists=" + lists + ", dog=" + dog + ‘}‘; }

再定義一個dog的實體類

package com.example.demo.entity;
public class Dog {
    private String name;
    private Integer age;

    @Override
    public String toString() {
        return "Dog{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ‘}‘;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}
set/get方法......

再定義一個測試類:

package com.example.demo;
import com.example.demo.entity.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
 * springBoot測試
 * 可以在測試期間可以很方便的類似編碼一樣進行自動註入等容器的功能
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
    @Autowired
    Person person;
    @Test
    public void contextLoads() {
        System.out.println(person);
    }
}

測試結果:

技術分享圖片

重點:

2、@Value獲取值和@ConfigurationProperties獲取值比較

@ConfigurationProperties@Value
功能 批量註入配置文件中的屬性 一個個指定
松散綁定(松散語法) 支持 不支持
SpEL 不支持 支持
JSR303數據校驗 支持 不支持
復雜類型封裝 支持 不支持

配置文件yml還是properties他們都能獲取到值;

如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value;

如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties;

所以我們也可以利用@Value()進行賦值:

@Componentpublic class Person {
   //lastName必須是郵箱格式@Value("${person.last-name}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;
   @Value("true")
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

在配置文件值註入的時候進行數據校驗:

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
   //lastName必須是郵箱格式
    @Email
    private String lastName;
    private Integer age;private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
private Boolean boss;

3、@PropertySource&@ImportResource&@Bean

@PropertySource:加載指定的配置文件,將配置文件中配置的每一個屬性的值,映射到這個組件中
@ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定,
prefix = "person":配置文件中哪個下面的所有屬性進行一一映射只有這個組件是容器中的組件,才能

容器提供的@ConfigurationProperties功能,@ConfigurationProperties(prefix = "person")默認從全局

配置文件中獲取值。

@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
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;
}
set/get方法.....

@ImportResource:導入Spring的配置文件,讓配置文件裏面的內容生效;

Spring Boot裏面沒有Spring的配置文件,我們自己編寫的配置文件,也不能自動識別;

想讓Spring的配置文件生效,加載進來;@ImportResource標註在一個配置類上

@ImportResource(locations = {"classpath:beans.xml"})
導入Spring的配置文件讓其生效

SpringBoot推薦給容器中添加組件的方式;推薦使用全註解的方式

1、配置類@Configuration

2、使用@Bean給容器中添加組件

@Configuration
public class MyAppConfig {
    //將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
    @Bean
    public HelloService helloServicfun(){
        System.out.println("配置類@Bean給容器中添加組件了...");
        return new HelloService();
    }
}

SpingBoot之配置文件的值註入問題