SpingBoot之配置文件的值註入問題
阿新 • • 發佈:2018-10-12
必須 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; @Overridepublic 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); } }
測試結果:
重點:
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量註入配置文件中的屬性 | 一個個指定 |
松散綁定(松散語法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303數據校驗 | 支持 | 不支持 |
復雜類型封裝 | 支持 | 不支持 |
配置文件yml還是properties他們都能獲取到值;
@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之配置文件的值註入問題