自定義配置
SpringBoot免除了專案中大部分手動配置,可以說,幾乎所有的配置都可以寫在全域性配置檔案application.peroperties中,SpringBoot會自動載入全域性配置檔案從而免除我們手動載入的煩惱。但是,如果我們自定義了配置檔案,那麼SpringBoot是無法識別這些配置檔案的,此時需要我們手動載入。
接下來,將針對SpringBoot的自定義配置檔案及其載入方式進行講解。
(1)使用@PropertySource載入配置檔案
我們可以使用@PropertySource註解結合@Configuration註解配置類的方式來載入自定義配置檔案,@PropertySource註解用於指定自定義配置檔案的具體位置和名稱。同時,為了保證SpringBoot能夠掃描該註解,還需要在類上新增@Configuration註解將實體類作為自定義配置類。
如果需要將自定義配置檔案中的屬性值注入到對應類的屬性中,可以使用@ConfigurationProperties註解或者@Value註解進行屬性值注入。
操作步驟:
1、在SpringBoot專案的resources目錄下新建一個名為test.properties的自定義配置檔案,在該配置檔案中編寫需要設定的配置屬性:
# 對實體類物件MyProperties進行屬性配置 test.id=1 test.name=test
2、在com.hardy.springboot_demo.pojo包下新建一個配置類MyProperties,提供test.properties自定義配置檔案中對應的屬性,並根據@PropertySource註解的使用進行相關的配置:
package com.hardy.springboot_demo.pojo; /** * @Author: HardyYao * @Date: 2021/5/31 */ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration // 自定義配置類 @PropertySource("classpath:test.properties") // 指定自定義配置檔案的檔案位置和檔名稱 @EnableConfigurationProperties(MyProperties.class) // 開啟對應配置類的屬性注入功能 @ConfigurationProperties(prefix = "test") // 指定配置檔案注入屬性字首 public class MyProperties { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "MyProperties{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
這裡主要是新建一個自定義配置類,通過相關注解引入了自定義的配置檔案,並完成了自定義屬性值的注入。
針對上述的幾個註解,進行逐一講解:
- @Configuration註解表示當前類是一個自定義配置類,並新增為Spring容器的元件,這裡也可以使用傳統的@Component註解實現相同的功能;
- @PropertySource("classpath:test.properties")註解指定了定義配置檔案的檔案位置和檔名稱,此處表示自定義配置檔案為classpath類路徑下的test.properties檔案;
- @ConfigurationProperties(prefix = "test")將上述自定義配置檔案test.properties中以test開頭的屬性值注入到該配置類屬性中;
- 如果配置類上使用的是@Component註解而非@Configuration註解,那麼@EnableConfigurationProperties註解還可以省略。
3、編寫測試方法進行測試:
@Autowired private MyProperties myProperties; @Test void myPropertiesTest() { System.out.println(myProperties); }
測試結果:
(2)使用@Configuration編寫自定義配置類
在SpringBoot框架中,推薦使用配置類的方式向容器中新增和配置元件。
在SpringBoot框架中,通常使用@Configuration註解定義一個配置類,SpringBoot會自動掃描和識別配置類,從而替換傳統Spring框架中的XML配置檔案。
當自定義一個配置類後,還需要在類中的方法上加上@Bean註解進行元件配置,將方法的返回物件注入到Spring容器中,並且元件名稱預設使用的是方法名,當然也可以使用@Bean註解的name或value屬性自定義元件的名稱。
操作步驟:
1、在com.hardy.springboot_demo包下新建一個config包,並在該包下新建一個MyService類,該類中不需要寫任何程式碼:
package com.hardy.springboot_demo.config; /** * @Author: HardyYao * @Date: 2021/5/31 */ public class MyService { }
由於該類目前沒有任何配置和註解,因此還無法正常被SpringBoot掃描和識別。
2、在config包下,新建一個MyConfig類,並使用@Configuration註解將該類宣告為一個配置類,該類的內容如下:
package com.hardy.springboot_demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Author: HardyYao * @Date: 2021/5/31 */ @Configuration // 定義該類為一個配置類 public class MyConfig { /** * 將返回值物件作為元件新增到Spring容器中,該元件id預設為方法名 * @return */ @Bean public MyService myService(){ return new MyService(); } }
MyConfig是@Configuration註解宣告的配置類(類似於宣告瞭一個XML配置檔案),該配置類會被SpringBoot自動掃描識別。
使用@Bean註解的myService()方法,其返回值物件會作為元件新增到Spring容器中(類似於XML配置檔案中的標籤配置),並且該元件id預設為方法名myService。
3、編寫測試方法進行測試
@Autowired private ApplicationContext applicationContext; @Test void iocTest() { System.out.println(applicationContext.containsBean("myService")); }
上述程式碼中,先通過@Autowired註解注入Spring容器示例ApplicationContext,然後在測試方法iocTest()中測試檢視該容器中是否包含id為myService的元件。
執行測試方法iocTest(),執行結果如下:
從測試結果可以看出,測試方法iocTest()執行成功,顯示執行結果為true,表示Spirng的IOC容器中也包含了id為myService的例項物件元件,說明使用自定義配置類的形式完成了向Spring容器進行元件的新增和配置。
隨機數設定及引數間引用
在SpringBoot配置檔案中設定屬性時,除了可以像前面示例中顯示的配置屬性值外,還可以使用隨機值和引數間引用對屬性值進行設定。下面,針對配置檔案中這兩種屬性值的設定方式進行講解。
隨機值設定
在SpringBoot配置檔案中,隨機值設定使用到了SpringBoot內嵌的RandomValuePropertySource類,對一些隱祕屬性值或者測試用例屬性值進行隨機值注入。
隨機值設定的語法格式為${random.xx},xx表示需要制定生成的隨機數型別和範圍,它可以生成隨機的整數、uuid或字串,示例程式碼如下:
my.secret=${random.value} // 配置隨機值 my.number=${random.int} // 配置隨機整數 my.bignumber=${random.long} // 配置隨機long型別數 my.uuid=${random.uuid} // 配置隨機uuid型別數 my.number.less.than.ten=${random.int(10)} // 配置小於10的隨機整數 my.number.in.range=${random.int[1024,65536]} // 配置範圍在[1024,65536]之間的隨機整數
上述程式碼中,使用RandomValuePropertySource類中random提供的隨機數型別,分別展示了不同型別隨機值的設定示例。
引數間引用
在SpringBoot配置檔案中,配置檔案的屬性值還可以進行引數間的引用,也就是在後一個配置的屬性值中直接引用先前定義過的屬性,這樣就可以直接解析其中的屬性值了。
使用引數間引用的好處就是,在多個具有相互關聯的配置屬性中,只需要對其中一處屬性進行預先配置,那麼其他地方都可以引用,省去了後續多處修改的麻煩。
引數間引用的語法格式為${xx},xx表示先前在配置檔案中已經配置過的屬性名,示例程式碼如下:
app.name=MyApp app.description=${app.name} is a Spring Boot application
上述引數間引用設定示例中,先設定了“app.name=MyApp”,將app.name屬性的屬性值設定為了MyApp;接著,在app.description屬性配置中,使用${app.name}對前一個屬性進行了引用。
接下來,通過一個案例來演示使用隨機值設定以及引數間引用的方式進行屬性設定的具體使用和效果,具體步驟如下:
1、開啟全域性配置檔案application.properties,在該配置檔案中分別通過隨機值設定和引數間引用來配置兩個屬性,示例程式碼如下:
# 隨機值設定以及引數間引用配置
hardy.age=${random.int[20,30]}
hardy.description=hardy的年齡可能是${hardy.age}
在上述application.properties配置檔案中,先使用隨機數設定了hardy.age的屬性值,該屬性值的取值範圍在[10,20]之間,隨後使用引數間引用配置了hardy.description屬性。
2、在專案的測試類中新增description屬性,並將配置檔案中hardy.description的屬性進行注入,然後新增一個測試方法進行測試,測試程式碼如下:
@Value("${hardy.description}") private String description; @Test void placeholderTest() { System.out.println(description); }
在上述程式碼中,通過@Value("${hardy.description}")註解將配置檔案中的hardy.description屬性值注入到了對應的description屬性中,在測試方法placeholderTest()中對該屬性值進行了輸出列印。
執行測試方法後,控制檯輸出結果如下所示:
可以看到,測試方法placeholderTest()成功列印出了description屬性的注入內容(age的取值始終在[20,30]之間隨機顯示),該內容與配置檔案中配置的屬性值保持一致。