1.7 自定義配置
?????????spring Boot免除了項(xiàng)目中大部分的手動(dòng)配置,對(duì)于一些特定情況哑芹,我們可以通過修改全局配置文件以適應(yīng)具體生產(chǎn)環(huán)境,可以說,幾乎所有的配置都可以寫在application.peroperties文件中干茉,Spring Boot會(huì)自動(dòng)加載全局配置文件從而免除我們手動(dòng)加載的煩惱。但是很泊,如果我們自定義配置文件角虫,Spring Boot是無法識(shí)別這些配置文件的,此時(shí)就需要我們手動(dòng)加載委造。接下來戳鹅,將針對(duì)Spring
Boot的自定義配置文件及其加載方式進(jìn)行
1.7.1 使用@PropertySource加載配置文件
?????????對(duì)于這種加載自定義配置文件的需求,可以使用@PropertySource注解結(jié)合@Configuration注解配置類的方式來實(shí)現(xiàn)争涌。@PropertySource注解用于指定自定義配置文件的具體位置和名稱粉楚。同時(shí),為了保證Spring Boot能夠掃描該注解亮垫,還需要類上添加@Configuration注解將實(shí)體類作為自定義配置類模软。
當(dāng)然,如果需要將自定義配置文件中的屬性值注入到對(duì)應(yīng)類的屬性中饮潦,可以使用@ConfigurationProperties或者@Value注解進(jìn)行屬性值注入 ?
演示:
?????(1)打開Spring Boot項(xiàng)目的resources目錄燃异,在項(xiàng)目的類路徑下新建一個(gè)test.properties自定義配置文件,在該配置文件中編寫需要設(shè)置的配置屬性
`properties
#對(duì)實(shí)體類對(duì)象MyProperties進(jìn)行屬性配置
test.id=110
test.name=test
????(2)在com.lagou.pojo包下新創(chuàng)建一個(gè)配置類MyProperties继蜡,提供test.properties自定義配置文件中對(duì)應(yīng)的屬性回俐,并根據(jù)@PropertySource注解的使用進(jìn)行相關(guān)配置?
java
????? @Configuration??? //自定義配置類
????? @PropertySource("classpath:test.properties")?? //指定自定義配置文件位置和名稱
????? @EnableConfigurationProperties(MyProperties.class)//開啟對(duì)應(yīng)配置類的屬性注入功能
????? @ConfigurationProperties(prefix ="test")????? //指定配置文件注入屬性前綴
????? public class MyProperties {
????? ???private int id;
????? ???private String name;
????? ???//省略屬性getXX()和setXX()方法
????? ???//省略toString()方法
?}
?????????主要是一個(gè)自定義配置類,通過相關(guān)注解引入了自定義的配置文件稀并,并完成了自定義屬性值的注入仅颇。針對(duì)示例中的幾個(gè)注解,具體說明如下 ?
* @Configuration注解表示當(dāng)前類是一個(gè)自定義配置類碘举,并添加為Spring容器的組件忘瓦,這里也可以使用傳統(tǒng)的@Component注解;
*@PropertySource("classpath:test.properties")注解指定了自定義配置文件的位置和名稱引颈,此示例表示自定義配置文件為classpath類路徑下的test.properties文件耕皮;
* @ConfigurationProperties(prefix =
"test")注解將上述自定義配置文件test.properties中以test開頭的屬性值注入到該配置類屬性中。
* 如果配置類上使用的是@Component注解而非@Configuration注解蝙场,那么@EnableConfigurationProperties注解還可以省略 ?
(3)進(jìn)行測(cè)試
java
?@Autowired
?private MyProperties myProperties;
?@Test
?public void myPropertiesTest() {
???System.out.println(myProperties);
? }
打印結(jié)果:
<img
src="./images/image-20191225162728286.png"
alt="image-20191225162728286" style="zoom:80%;" />
1.7.2??使用@Configuration編寫自定義配置類
在Spring Boot框架中凌停,推薦使用配置類的方式向容器中添加和配置組件 ?
在Spring Boot框架中,通常使用@Configuration注解定義一個(gè)配置類售滤,Spring Boot會(huì)自動(dòng)掃描和識(shí)別配置類罚拟,從而替換傳統(tǒng)Spring框架中的XML配置文件。
當(dāng)定義一個(gè)配置類后,還需要在類中的方法上使用@Bean注解進(jìn)行組件配置舟舒,將方法的返回對(duì)象注入到Spring容器中拉庶,并且組件名稱默認(rèn)使用的是方法名,當(dāng)然也可以使用@Bean注解的name或value屬性自定義組件的名稱 ?
演示:
(1)在項(xiàng)目下新建一個(gè)com.lagou.config包秃励,并在該包下新創(chuàng)建一個(gè)類MyService氏仗,該類中不需要編寫任何代碼?
java
public class MyService {
}
創(chuàng)建了一個(gè)空的MyService類,而該類目前沒有添加任何配置和注解夺鲜,因此還無法正常被Spring Boot掃描和識(shí)別 ?
(2) 在項(xiàng)目的com.lagou.config包下皆尔,新建一個(gè)類MyConfig,并使用@Configuration注解將該類聲明一個(gè)配置類币励,內(nèi)容如下:
java
????? @Configuration? //定義該類是一個(gè)配置類
????? public class MyConfig {
????? ???@Bean??????? //將返回值對(duì)象作為組件添加到Spring容器中慷蠕,該組件id默認(rèn)為方法名
????? ???public MyService myService(){
????? ???????return new MyService();
????? ??? }
?????? }
?????????MyConfig是@Configuration注解聲明的配置類(類似于聲明了一個(gè)XML配置文件),該配置類會(huì)被Spring Boot自動(dòng)掃描識(shí)別食呻;使用@Bean注解的myService()方法流炕,其返回值對(duì)象會(huì)作為組件添加到了Spring容器中(類似于XML配置文件中的<bean>標(biāo)簽配置),并且該組件的id默認(rèn)是方法名myService
(3)測(cè)試類
java
@Autowired
private ApplicationContext
applicationContext;
@Test
public void iocTest() {
?????? System.out.println(applicationContext.containsBean("myService"));
}
上述代碼中仅胞,先通過@Autowired注解引入了Spring容器實(shí)例ApplicationContext每辟,然后在測(cè)試方法iocTest()中測(cè)試查看該容器中是否包括id為myService的組件。
執(zhí)行測(cè)試方法iocTest() 干旧,查看控制臺(tái)輸出效果渠欺,結(jié)果如下:
<img src="./images/image-20191225170545727.png"
alt="image-20191225170545727" style="zoom:80%;" />
?從測(cè)試結(jié)果可以看出,測(cè)試方法iocTest()運(yùn)行成功椎眯,顯示運(yùn)行結(jié)果為true挠将,表示Spirng的IOC容器中也已經(jīng)包含了id為myService的實(shí)例對(duì)象組件,說明使用自定義配置類的形式完成了向Spring容器進(jìn)行組件的添加和配置
剛學(xué)了拉勾教育的《Java工程師高薪訓(xùn)練營(yíng)》编整,看到剛學(xué)到的點(diǎn)就回答了舔稀。希望拉勾能給我推到想去的公司,目標(biāo):字節(jié)U撇狻镶蹋!