SpringBoot 給bean的屬性注入值

SpringBoot給屬性注入值的兩種方式:

一、使用 @ConfigurationProperties 註解

該註解將全局配置文件(application.properties 或 application.yml 文件)中配置的每一個屬性的值,映射到當前類的屬性上。告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定;

【注意】:@ConfigurationProperties 註解只能映射全局配置文件中所配置的屬性值,如果是自定義的配置文件,則映射不到。

1.javaBean:

/**
 * prefix = "person":配置文件中person 下面的所有屬性進行一一映射
 * 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能,因此需要使用 @Component 註解將當前類掃描到容器中;
 */
@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;

2.配置文件

person:
    lastName: hello
    age: 18
    boss: false
    birth: 2017/12/12
    maps: {k1: v1,k2: 12}
    lists:
      - lisi
      - zhaoliu
    dog:
      name: 小狗
      age: 12

3.測試

在 SpringBoot的測試類中進行測試:
springboot 單元測試,可以在測試期間很方便的將類自動注入到容器。

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootConfigApplicationTests{
	@Autowired
	Person person;

	@Test
	public void contestLoads(){
		System.out.println(person);
	}
}

二、使用 @Value 註解爲 bean 的屬性注入值。

類似於spring 配置文件中用標籤配置bean,@value 註解可以直接給bean的屬性賦值。

<bean> <property name="name" value="zs"></property></bean>

@Value註解的使用方式和標籤的方式一樣,可以使用以下方式配置值:
(1).字面量;
(2).${key},從環境變量、配置文件中獲取值;
(3).#{SpEL};

1.javaBean

@Component
public class Person {
	@Value("${person.lase-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;

2.配置文件

person.last-name=張三
person.age=18
person.boss=false

3.測試(同@configurationProperties測試方法)

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

無論全局配置文件是 yml 還是 properties 他們都能獲取到值,但有如下不同:

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

【tips】:
(1).鬆散綁定是指:無論是 yml 配置文件中叫last-name、lastName、或者 properties 文件中叫 person.last-name,都能成功的將配置文件的值注入給bean的屬性。
(2).複雜類型封裝:@Value 註解的方式無法給類似於 Map 等類型的屬性注入值,只能給簡單數據類型注入值。

如何選擇:

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

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

舉例:

@RestController
public Class HelloController{
	@Value("${person.last-name}")
	private String name;	

	@RequestMapping("sayhello")
	public String sayHello(){
		return "hello"+name;
	}
}

啓動 springboot 應用後,在頁面訪問 localhost:8081/sayhello,頁面正常返回數據。

四、配置文件注入值數據校驗

只有@ConfigurationProperties 的方式支持注入數據值校驗。

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {

    /**
     * <bean class="Person">
     *      <property name="lastName" value="字面量/${key}從環境變量、配置文件中獲取值/#{SpEL}"></property>
     * <bean/>
     */

   //emailAddress必須是郵箱格式
    @Email
    private String emailAddress;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章