java?springboot中如何讀取配置文件的屬性
我們知道在比較大型的項(xiàng)目的開(kāi)發(fā)中,比較經(jīng)常修改的屬性我們一般都是不會(huì)在代碼里面寫(xiě)死的,而是將其定義在配置文件中,之后如果修改的話(huà),我們可以直接去配置文件中修改,那么在springboot的項(xiàng)目中,我們應(yīng)該如何實(shí)現(xiàn)這個(gè)呢?
接下來(lái)我們以一個(gè)實(shí)例的形式教大家如何讀取配置文件中的屬性并使用。
以yml中數(shù)據(jù)庫(kù)的配置為例,配置文件如下:
配置文件
jdbc: driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test username: root password: root
(1)使用注解@Value映射
首先第一種方法,使用@Value注解進(jìn)行映射,這種方法適用于對(duì)象的參數(shù)比較少的情況,我們可以直接在對(duì)象的屬性上使用@Value注解,在其中以${}的形式傳入配置文件中對(duì)應(yīng)的屬性
同時(shí)需要在該類(lèi)的上方使用@Configuration注解,將該類(lèi)作為配置文件加入,在啟動(dòng)項(xiàng)目的時(shí)候?qū)崿F(xiàn)注入。
實(shí)例如下:
@Configuration public class JdbcProperties { @Value("${jdbc.driverClassName}") private String driverClassName; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; }
這樣我們?cè)谑褂迷搶?duì)象的屬性值的時(shí)候,可以直接通過(guò)調(diào)用該對(duì)象的屬性獲取。
(2)使用@ConfigurationProperties映射
第二種方法相對(duì)于第一種方法更簡(jiǎn)單一些,不需要在每一個(gè)字段的上面的使用@Value注解,直接使用一個(gè)@ConfigurationProperties注解標(biāo)注在類(lèi)上即可,在其中傳入的參數(shù)為在yml配置文件上參數(shù)的前綴,但是效果是和第一種是一樣的
@ConfigurationProperties注解聲明當(dāng)前類(lèi)為配置讀取類(lèi)
prefix="jdbc"表示讀取前綴為jdbc的屬性
會(huì)將配置文件中前綴為prefix的屬性賦給類(lèi)中同名的字段
實(shí)例如下:
@ConfigurationProperties(prefix = "jdbc") public class JdbcProperties { private String driverClassName; private String url; private String username; private String password; }
使用該注解時(shí)有一點(diǎn)需要注意:必須保證屬性名稱(chēng)和字段一模一樣,且類(lèi)需要提供字段的setter方法
但是如果只使用@ConfigurationProperties注解是沒(méi)有效果的,他并不會(huì)講配置文件中的參數(shù)和屬性匹配。他需要配合其他在啟動(dòng)項(xiàng)目時(shí)會(huì)生效的注解一起使用才會(huì)生效
一種方法是在JdbcProperties類(lèi)上添加一個(gè)@Configuration注解,將其標(biāo)識(shí)為配置類(lèi)
如下:
@Configuration @ConfigurationProperties(prefix = "jdbc") public class JdbcProperties { private String driverClassName; private String url; private String username; private String password; }
或者還有第二種方法:我們還可以在Spring中使用這個(gè)配置讀取類(lèi),通過(guò)@EnableConfigurationProperties注解可以將指定的配置讀取類(lèi)的對(duì)象加載到Spring容器,也就是說(shuō),在其他配置類(lèi)上使用一個(gè)@EnableConfigurationProperties注解,來(lái)將配置文件的參數(shù)和JdbcProperties類(lèi)的屬性綁定。這樣就不需要在JdbcProperties類(lèi)上使用@Configuration注解了
實(shí)例如下:
@Configuration @EnableConfigurationProperties(JdbcProperties.class) public class JdbcConfig { @Autowired private JdbcProperties prop; /** 這種方式不需要@Autowired注入字段,也不需要構(gòu)造函數(shù)注入, 直接在方法中定義配置讀取類(lèi)的形參,Springboot在創(chuàng)建DataSource對(duì)象時(shí)會(huì)自動(dòng)注入JdbcProperties對(duì)象 */ @Bean public DataSource dataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(prop.getDriverClassName()); dataSource.setUrl(prop.getUrl()); dataSource.setUsername(prop.getUsername()); dataSource.setPassword(prop.getPassword()); return dataSource; } }
(3)推薦使用:極簡(jiǎn)方式 @Bean和@ConfigurationProperties注解一起使用,
對(duì)于我個(gè)人的習(xí)慣而言,在使用的時(shí)候,我還是喜歡使用第三種方法,這種方法使用起來(lái)最簡(jiǎn)單,而且也最實(shí)用
在一個(gè)帶@Configuration注解的配置類(lèi)中,我們可以直接把@ConfigurationProperties(prefix = “jdbc”)注解聲明在需要使用的@Bean的方法上,Springboot會(huì)自動(dòng)將配置文件中以prefix開(kāi)頭的屬性賦給要?jiǎng)?chuàng)建對(duì)象的類(lèi)的同名字段上,使用前提:要求類(lèi)該類(lèi)必須提供了setter方法
使用這種方法的好處就是不要在bean上做任何額外的注解聲明。統(tǒng)一將需要進(jìn)行注入容易或和配置文件參數(shù)進(jìn)行綁定的類(lèi)放置在一個(gè)帶@Configuration注解的類(lèi)中即可!
@Configuration public class JdbcConfig { @Bean @ConfigurationProperties(prefix = "jdbc") public JdbcProperties jdbcProperties(){ return new JdbcProperties(); } }
但是以上的操作,只是將bean注入到了容器中,那么在其他類(lèi)中使用的話(huà),還是需要在每一個(gè)對(duì)象上使用@Autowired注解,那么有沒(méi)有什么方法可以不使用@Autowired注解來(lái)聲明自動(dòng)注入呢?
@RequiredArgsConstructor注解實(shí)現(xiàn)自動(dòng)注入
使用@RequiredArgsConstructor注解可以代替@autowired注解實(shí)現(xiàn)對(duì)象屬性的自動(dòng)注入,
使用場(chǎng)景:需要注入很多的mapper接口或者另外的service接口,這時(shí)候就會(huì)寫(xiě)很多的@Autowired注解,代碼看起來(lái)很亂,lombok提供了一個(gè)注解:
@RequiredArgsConstructor(onConstructor =@_(@Autowired))
寫(xiě)在類(lèi)上可以代替@Autowired注解,需要注意的是在注入時(shí)需要用final定義,或者使用@notnull注解
@RestController @RequiredArgsConstructor public class LoginTest { // @Autowired private final LoginProperties loginProperties; @RequestMapping("/login01") public void loginTest01(){ System.out.println("進(jìn)入loginTest01方法~~~"); String language = loginProperties.getLanguage(); System.out.println(language); } }
這樣就可以避免寫(xiě)入重復(fù)的@Autowired了,但是就是需要注意對(duì)象必須是final修飾的才行
總結(jié)
如果需要將類(lèi)屬性與配置文件中的參數(shù)綁定,并且注入到容器中時(shí),推薦使用第三種方法和@RequiredArgsConstructor注解來(lái)實(shí)現(xiàn)?。?!
到此這篇關(guān)于java springboot中如何讀取配置文件的屬性的文章就介紹到這了,更多相關(guān)java springboot讀取文件屬性?xún)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SSH框架網(wǎng)上商城項(xiàng)目第2戰(zhàn)之基本增刪查改、Service和Action的抽取
SSH框架網(wǎng)上商城項(xiàng)目第2戰(zhàn)之基本增刪查改、Service和Action的抽取,感興趣的小伙伴們可以參考一下2016-05-05Java對(duì)象的復(fù)制三種方式(小結(jié))
這篇文章主要介紹了Java對(duì)象的復(fù)制三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Java動(dòng)態(tài)代理靜態(tài)代理實(shí)例分析
這篇文章主要介紹了Java動(dòng)態(tài)代理靜態(tài)代理實(shí)例分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03springboot與數(shù)據(jù)庫(kù)返回?cái)?shù)據(jù)中文亂碼
大家好,本篇文章主要講的是springboot與數(shù)據(jù)庫(kù)返回?cái)?shù)據(jù)中文亂碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽2022-01-01使用log4j2打印mybatis的sql執(zhí)行日志方式
這篇文章主要介紹了使用log4j2打印mybatis的sql執(zhí)行日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09在Spring中基于Java類(lèi)進(jìn)行配置的完整步驟
基于Java配置選項(xiàng),可以編寫(xiě)大多數(shù)的Spring不用配置XML,下面這篇文章主要給大家介紹了關(guān)于在Spring中基于Java類(lèi)進(jìn)行配置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05Java工廠模式用法之如何動(dòng)態(tài)選擇對(duì)象詳解
工廠設(shè)計(jì)模式可能是最常用的設(shè)計(jì)模式之一,我想大家在自己的項(xiàng)目中都用到過(guò)。本文不僅僅是關(guān)于工廠模式的基本知識(shí),更是討論如何在運(yùn)行時(shí)動(dòng)態(tài)選擇不同的方法進(jìn)行執(zhí)行,你們可以看看是不是和你們項(xiàng)目中用的一樣2023-03-03springboot整合持久層的方法實(shí)現(xiàn)
本文主要介紹了springboot整合持久層的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09