Spring-boot入門之配置詳解

1.配置文件

spring-boot默認有兩種配置文件

  • appliation.properties
  • appliation.yml
    配置文件默認放在src/main/resources目錄或者是類路徑/config

配置文件的作用:修改spring-boot自動配置的默認值

2.YAML

.yml 即YAML

YAML Ain’t Markup Language

傳統的java項目中,多使用xml文件,而YAML文件以數據爲中心,比json、xml更加適合做配置文件,更加簡潔
- YAML配置範例

server:
  port: 7900
  • xml配置範例
<server>
    <port>7900</port>
</server>

對比之下,我們可以看到,使用YAML要更加的簡潔方便

3.YAML語法

  • 基本語法
    k:(空格)V 表示一對鍵值對(空格必須要有)
    空格的縮進來控制層級關係,只要左對齊的一列數據都是同一層級的
server:
    port: 8080
    path: /api

上述代碼中,port和path爲同一層級的

屬性和值嚴格區分大小寫

  • 值的寫法
字面量: 普通的值(數字、字符串、布爾)
k: v
字面量直接來寫
字符串默認不加上單引號或雙引號

雙引號不會轉義字符串裏面的特殊字符,特殊字符會作爲本身想要表示的意思
如 name: "zhagnsan \n lisi" 結果:zhangsan 換行 lisi

單引號會轉義字符串裏的特殊字符,特殊字符最終只是一個普通的字符串數據
如 name: 'zhagnsan \n lisi' 結果:zhangsan \n lisi
對象、Map(屬性和值、鍵值對)

k: v 在下一行來寫對象的屬性和值得關係,只需要注意縮進即可

user:
    name: zhangsan
    age: 20

行內寫法

user: {name: zhangsan,age: 20}
數組

- 值表示數組中的一個元素

pets: 
    - cat
    - dog
    - pig

行內寫法

pets: [cat,dog,pig]

4.spring-boot中使用yml

  • 添加依賴
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
  • 編寫兩個類
@Component
@ConfigurationProperties(prefix="user")
public class User {

    private String lastName;

    private Integer age;

    private Boolean boss;

    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;

    private Dog dog;
    //getter 和setter
}

public class Dog {

    private String name;

    private Integer age;
    //getter 和 setter
}
  • 文件中配置信息
user:
  lastName: zhangsan
  age: 18
  boss: false
  birth: 2017/12/12
  maps: {k1: v1,k2: 12}
  lists: 
   - lisi
   - hello
   - zhaoliu
  dog:
    name: kitty
    age: 1

@ConfigurationProperties 告訴spring-boot將本類中的所有屬性和配置文件中的相關配置進行綁定
prefix=”user” 配置文件中哪個下面的屬性進行一一映射
只有容器中的類,spring-boot纔會綁定配置文件中的信息,所以要使用 @Component 生命其實一個spring 的bean

  • 測試
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    private User user;

    @Test
    public void contextLoads() {

        System.out.println(user);
    }

}

執行單元測試,執行結果中發現,配置文件中的信息已經綁定到了User 的屬性中

5.spring-boot中使用properties文件配置信息

user.last-name=張三
user.age=18
user.boss=false
user.maps.k1=v1
user.maps.k2=v2
user.lists=lisi,hello,zhaoliu
user.dog.name=kitty
user.dog.age=1

類中的信息不用任何修改,但是對於配置文件中的中文,會有亂按問題,在不同的IDE中,要使用不同的方式進行調整

6.@ConfigurationProperties和@Value使用對比

@ConfigurationProperties支持批量綁定,@Value只能單個綁定
@ConfigurationProperties支持鬆散綁定(駝峯命名),@Value不支持鬆散綁定
@ConfigurationProperties不支持SpEL,@Value支持SpEL
@ConfigurationProperties只是JSR303數據校驗,@Value不支持JSR303
@ConfigurationProperties 支持複雜類型,@Value不支持複雜類型

7.@PropertySource和@ImportResource

@PropertySource 用於加載指定的properties配置文件

@ImportResource 導入spring的配置文件,使配置文件中的內容生效

@ImportResource("classpath:beans.xml")
7.@Configuration和@Bean

spring-boot推薦使用全註解的方式向容器中添加組件 @Bean,就是自己聲明一個配置類,用來代替原來的配置文件。如何能讓spring-boot能夠自動的識別我們自定義的類爲一個配置類呢?就需要用到@Configuration 這個註解了

當然僅僅使用@Configuration 這一個註解是不夠的,還需要與@Bean配合使用

@Configuration
public class AppConfig {
    @Bean
    public User initUser() {
        return new User();
    }
}

如代碼所示,spring-boot會將@Configuration 修飾的類中,調用@Bean 修飾的方法,將方法的返回值添加到容器中,而容器中這個對象的默認id就是方法名

7.在配置文件中使用佔位符
user.last-name=hello${random.uuid}
user.dog.name=${user.last-name}-kitty

如代碼所示,user.last-name 會生成一個隨機的uuid字符串,而user.dog.name中,也會將上面的user.last-name 添加進去

  • 對不存在的配置添加默認值
user.dog.name=${user.friend:lisi}-kitty

在配置文件中,user.friend並不存在,所在獲取的時候,spring-boot會自動將: 後面的值作爲這個屬性的默認值進行處理

如果沒有設置默認值

user.dog.name=${user.friend}-kitty

則會將 ${user.friend}作爲一個普通的字符串處理

  • 佔位符中的隨機數
${random.value}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024,65536]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章