SpringBoot讀取配置文件常用方法解析
首先回憶一下在沒有使用SpringBoot之前也就是傳統(tǒng)的spring項(xiàng)目中是如何讀取配置文件,通過I/O流讀取指定路徑的配置文件,然后再去獲取指定的配置信息。
傳統(tǒng)項(xiàng)目讀取配置方式
讀取xml配置文件
public String readFromXml(String xmlPath, String property) { SAXReader reader = new SAXReader(); Document doc = null; try { doc = reader.read(new File(xmlPath)); } catch (DocumentException e) { e.printStackTrace(); } Iterator<Element> iterator = doc.getRootElement().elementIterator(); while (iterator.hasNext()){ Element element = iterator.next(); if (element.getQName().getName().equals(property)){ return element.getTextTrim(); } } return null; }
讀取.properties配置文件
public String readFromProperty(String filePath, String property) { Properties prop = new Properties(); try { prop.load(new FileInputStream(filePath)); String value = prop.getProperty(property); if (value != null) { return value; } } catch (IOException e) { e.printStackTrace(); } return null; }
SpringBoot讀取配置方式
如何使用SpringBoot讀取配置文件,從使用Spring慢慢演變,但是本質(zhì)原理是一樣的,只是SpringBoot簡化配置,通過注解簡化開發(fā),接下來介紹一些常用注解。
@ImportResource注解
這個(gè)注解用來導(dǎo)入Spring的配置文件,是配置文件中的內(nèi)容注入到配置類中,參數(shù)是一個(gè)數(shù)組,可以注入多個(gè)配置文件
代碼演示:
在SpringBoot項(xiàng)目的resources目錄下創(chuàng)建一個(gè)xml配置文件beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="configBean" class="com.example.test.config.ConfigBean"> <property name="dbType" value="Oracle"/> <property name="driverClassName" value="jdbc.driver.Oracle.OracleDriver"/> <property name="host" value="127.0.0.1"/> <property name="userName" value="oracle"/> <property name="password" value="oracle"/> </bean> </beans>
創(chuàng)建配置類ConfigBean
package com.example.test.config; import lombok.Getter; import lombok.Setter; import lombok.ToString; /** * @author Vincente * @date 2020/07/12-12:29 * @desc 配置類 **/ @Setter @Getter @ToString public class ConfigBean { private String dbType; private String driverClassName; private String host; private String userName; private String password; }
添加@ImportResource注解,在SpringBoot項(xiàng)目的啟動類添加
package com.example.test; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; @SpringBootApplication @ImportResource(locations = {"classpath:beans.xml"}) public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } }
測試代碼
package com.example.test; import com.example.test.config.ConfigBean; import org.junit.jupiter.api.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; @SpringBootTest @RunWith(SpringRunner.class) class TestApplicationTests { @Autowired private ConfigBean configBean; @Test void testConfigBean(){ System.out.println(configBean); } }
輸出結(jié)果
ConfigBean(dbType=Oracle, driverClassName=jdbc.driver.Oracle.OracleDriver, host=127.0.0.1, userName=oracle, password=oracle)
小結(jié) @ImportResource注解可以用來加載一個(gè)外部xml文件,注入到項(xiàng)目完成配置,但是這樣引入xml并沒有達(dá)到SpringBoot簡化配置的目的。
@Configuration和@Bean注解#
@Configuration和@Bean注解并不能讀取配置文件中的信息,但是這兩個(gè)類本身用來定義配置類
@Configuration用來代替xml文件,添加在一個(gè)類上面
@Bean用來代替bean標(biāo)簽,聲明在方法上,方法的返回值返回一個(gè)對象到Spring的IoC容器中,方法名稱相當(dāng)于bean標(biāo)簽中的ID
代碼樣例
聲明一個(gè)bean
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author Vincente * @date 2020/07/12-13:28 * @desc **/ @Configuration public class RestTemplateConfig { @Bean public RestTemplateConfig restTemplate(){ return new RestTemplate(); } }
測試代碼
package com.example.test; import com.example.test.config.RestTemplateConfig; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; @SpringBootTest @RunWith(SpringRunner.class) class TestApplicationTests { @Resource private RestTemplateConfig restTemplate; @Test void testConfigBean(){ System.out.println(restTemplate); } }
輸出結(jié)果
com.example.test.config.RestTemplateConfig@de7e193
@Import注解
@Import注解是用來導(dǎo)入配置類或者一些需要前置加載的類,帶有@Configuration的配置類(4.2 版本之前只可以導(dǎo)入配置類,4.2版本之后 也可以導(dǎo)入 普通類)
代碼樣例
結(jié)合上面的代碼做修改,不全部貼出
將RestTemplateConfigestTemplateConfig類中的@Configuration注解去掉,在ConfigBean中導(dǎo)入
@Setter @Getter @ToString @Import(RestTemplateConfig.class) public class ConfigBean { private String dbType; private String driverClassName; private String host; private String userName; private String password; }
測試代碼
package com.example.test; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; @SpringBootTest @RunWith(SpringRunner.class) class TestApplicationTests { @Resource ApplicationContext ctx; @Test void testConfigBean(){ System.out.println(ctx.getBean("restTemplate")); } }
輸出結(jié)果
com.example.test.config.RestTemplateConfig@6cd15072
小結(jié) 可以看到在IoC容器中已經(jīng)導(dǎo)入了RestTemplateConfig(普通)類,這個(gè)注解類似于之前applicationContext.xml中的import標(biāo)簽
@ConfigurationProperties和@Value#
@ConfigurationProperties和@Value這兩個(gè)注解算是在SpringBoot中用的比較多的注解了,可以在項(xiàng)目的配置文件application.yml和application.properties中直接讀取配置,但是在用法上二者也是有一定的區(qū)別
代碼樣例
創(chuàng)建配置文件application.yml
db-config: db-type: Oracle driver-class-name: jdbc.driver.Ooracle.OracleDriver host: 127.0.0.1 user-name: Oracle password: Oracle server: port: 8080
創(chuàng)建配置類ConfigBean
package com.example.test.config; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.springframework.boot.context.properties.ConfigurationProperties; /** * @author Vincente * @date 2020/07/12-12:29 * @desc 配置類 **/ @Setter @Getter @ToString @ConfigurationProperties(prefix = "db-config") public class ConfigBean { private String dbType; private String driverClassName; private String host; private String userName; private String password; }
測試代碼
package com.example.test; import com.example.test.config.ConfigBean; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; @SpringBootTest @RunWith(SpringRunner.class) class TestApplicationTests { @Resource ConfigBean configBean; @Value("${server.port}") private String port; @Test void testConfigBean(){ System.out.println(configBean); System.out.println(port); } }
輸出結(jié)果
ConfigBean(dbType=Oracle, driverClassName=jdbc.driver.Ooracle.OracleDriver, host=127.0.0.1, userName=Oracle, password=Oracle)
8080
-總結(jié) 二者的一些區(qū)別
特性 | @ConfigurationProperties | @Value |
---|---|---|
SpEL表達(dá)式 | 不支持 | 支持 |
屬性松散綁定 | 支持 | 不支持 |
JSR303數(shù)據(jù)校驗(yàn) | 支持 | 不支持 |
添加校驗(yàn)注解
package com.example.test.config; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Null; /** * @author Vincente * @date 2020/07/12-12:29 * @desc 配置類 **/ @Setter @Getter @ToString @ConfigurationProperties(prefix = "db-config") @Validated public class ConfigBean { @Null private String dbType; private String driverClassName; private String host; private String userName; private String password; }
輸出結(jié)果
Description: Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'db-config' to com.example.test.config.ConfigBean failed: Property: db-config.dbType Value: Oracle Origin: class path resource [application.yml]:2:12 Reason: 必須為null
@PropertySource注解
@ConfigurationProperties和@Value這兩個(gè)注解默認(rèn)從項(xiàng)目的主配置文件中讀取配置,當(dāng)項(xiàng)目配置較多全部從一個(gè)地方讀取會顯得臃腫,可以將配置文件按照模塊拆分讀取到不同的配置類中,可以使用@PropertySource配合@Value讀取其他配置文件
代碼樣例
創(chuàng)建配置文件db-config.yml
/** * @author Vincente * @date 2020/07/12-14:19 * @desc **/ db-config: db-type: Oracle driver-class-name: jdbc.driver.Ooracle.OracleDriver host: 127.0.0.1 user-name: Oracle password: Oracle
創(chuàng)建配置類ConfigBean
package com.example.test.config; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; /** * @author Vincente * @date 2020/07/12-12:29 * @desc 配置類 **/ @Setter @Getter @ToString @PropertySource("classpath:db-config.yml") @Component public class ConfigBean { @Value("${db-type}") private String dbType; @Value("${driver-class-name}") private String driverClassName; @Value("${host}") private String host; @Value("${user-name}") private String userName; @Value("${password}") private String password; }
測試代碼
package com.example.test; import com.example.test.config.ConfigBean; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; @SpringBootTest @RunWith(SpringRunner.class) class TestApplicationTests { @Resource ConfigBean configBean; @Test void testConfigBean(){ System.out.println(configBean); } }
輸出結(jié)果
ConfigBean(dbType=Oracle, driverClassName=jdbc.driver.Ooracle.OracleDriver, host=127.0.0.1, userName=Vincente, password=Oracle)
小結(jié)
@PropertySource 用于獲取類路徑下的db-config.yml配置文件,@Value用于獲取yml中的配置信息,@Component注解用來將配置類交給Spring容器管理
總結(jié)
SpringBoot中提供了注解代替配置文件的方式來獲取項(xiàng)目中的配置,大大簡化了開發(fā),以上總結(jié)了常用的讀取配置的方法,簡單來說就是兩種文件(yml和properties)幾大注解(@Value,@PropertySource,@Configuration,@ConfigurationProperties,@Import,@Bean);首先要了解每個(gè)注解的使用場景后,其次根據(jù)項(xiàng)目實(shí)際情況來具體的使用
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于springcloud集成nacos遇到的問題
這篇文章主要介紹了關(guān)于springcloud集成nacos遇到的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01基于Spring的Maven項(xiàng)目實(shí)現(xiàn)發(fā)送郵件功能的示例
這篇文章主要介紹了基于Spring的Maven項(xiàng)目實(shí)現(xiàn)發(fā)送郵件功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03使用@JsonFormat和@DateTimeFormat對Date格式化操作
這篇文章主要介紹了使用@JsonFormat和@DateTimeFormat對Date格式化操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Lombok為啥這么牛逼?SpringBoot和IDEA官方都要支持它
Lombok是一款Java代碼功能增強(qiáng)庫,在Github上已有9.8k+Star。這篇文章主要介紹了Lombok為啥這么牛逼?SpringBoot和IDEA官方都要支持它,需要的朋友可以參考下2020-12-12Java?實(shí)戰(zhàn)范例之校園二手市場系統(tǒng)的實(shí)現(xiàn)
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+mysql+maven+tomcat實(shí)現(xiàn)一個(gè)校園二手市場系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11