springboot讀取配置檔案中的屬性並實現自動注入

今天這篇文章主要來和大家分享一下,在springboot中,如何讀取配置檔案中的屬性,

我們知道在比較大型的專案的開發中,比較經常修改的屬性我們一般都是不會在程式碼裡面寫死的,而是將其定義在配置檔案中,之後如果修改的話,我們可以直接去配置檔案中修改,那麼在springboot的專案中,我們應該如何實現這個呢?

接下來我們以一個例項的形式教大家如何讀取配置檔案中的屬性並使用。

以yml中資料庫的配置為例,配置檔案如下:

配置檔案

jdbc: driverClassName: com。mysql。jdbc。Driver url: jdbc:mysql://127。0。0。1:3306/test username: root password: root

(1)使用註解@Value對映

首先第一種方法,使用@Value註解進行對映,這種方法適用於物件的引數比較少的情況,我們可以直接在物件的屬性上使用@Value註解,在其中以${}的形式傳入配置檔案中對應的屬性,

同時需要在該類的上方使用@Configuration註解,將該類作為配置檔案加入,在啟動專案的時候實現注入。

例項如下:

@Configurationpublic 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;}

這樣我們在使用該物件的屬性值的時候,可以直接透過呼叫該物件的屬性獲取。

(2)使用@ConfigurationProperties對映

第二種方法相對於第一種方法更簡單一些,不需要在每一個欄位的上面的使用@Value註解,直接使用一個@ConfigurationProperties註解標註在類上即可,在其中傳入的引數為在yml配置檔案上引數的字首,但是效果是和第一種是一樣的,

@ConfigurationProperties註解聲明當前類為配置讀取類

prefix=“jdbc”表示讀取字首為jdbc的屬性

會將配置檔案中字首為prefix的屬性賦給類中同名的欄位

例項如下:

@ConfigurationProperties(prefix = “jdbc”)public class JdbcProperties { private String driverClassName; private String url; private String username; private String password;}

使用該註解時有一點需要注意:

必須保證屬性名稱和欄位一模一樣,且類需要提供欄位的setter方法

但是如果只使用@ConfigurationProperties註解是沒有效果的,他並不會講配置檔案中的引數和屬性匹配。他需要配合其他在啟動專案時會生效的註解一起使用才會生效,

一種方法是在JdbcProperties類上新增一個@Configuration註解,將其標識為配置類,

如下:

@Configuration@ConfigurationProperties(prefix = “jdbc”)public class JdbcProperties { private String driverClassName; private String url; private String username; private String password;}

或者還有第二種方法:我們還可以在Spring中使用這個配置讀取類,透過@EnableConfigurationProperties註解可以將指定的配置讀取類的物件載入到Spring容器,也就是說,在其他配置類上使用一個@EnableConfigurationProperties註解,來將配置檔案的引數和JdbcProperties類的屬性繫結。這樣就不需要在JdbcProperties類上使用@Configuration註解了,

例項如下:

@Configuration@EnableConfigurationProperties(JdbcProperties。class)public class JdbcConfig { @Autowired private JdbcProperties prop; /** 這種方式不需要@Autowired注入欄位,也不需要建構函式注入, 直接在方法中定義配置讀取類的形參,Springboot在建立DataSource物件時會自動注入JdbcProperties物件 */ @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)推薦使用:極簡方式 @Bean和@ConfigurationProperties註解一起使用,

對於我個人的習慣而言,在使用的時候,我還是喜歡使用第三種方法,這種方法使用起來最簡單,而且也最實用,

在一個帶@Configuration註解的配置類中,我們可以直接把@ConfigurationProperties(prefix = “jdbc”)註解宣告在需要使用的@Bean的方法上,Springboot會自動將配置檔案中以prefix開頭的屬性賦給要建立物件的類的同名欄位上,使用前提:要求類該類必須提供了setter方法

使用這種方法的好處就是不要在bean上做任何額外的註解宣告。統一將需要進行注入容易或和配置檔案引數進行繫結的類放置在一個帶@Configuration註解的類中即可!

@Configurationpublic class JdbcConfig { @Bean @ConfigurationProperties(prefix = “jdbc”) public JdbcProperties jdbcProperties(){ return new JdbcProperties(); }}

但是以上的操作,只是將bean注入到了容器中,那麼在其他類中使用的話,還是需要在每一個物件上使用@Autowired註解,那麼有沒有什麼方法可以不使用@Autowired註解來宣告自動注入呢?

@RequiredArgsConstructor註解實現自動注入

使用@RequiredArgsConstructor註解可以代替@autowired註解實現物件屬性的自動注入,

使用場景:

需要注入很多的mapper介面或者另外的service介面,這時候就會寫很多的@Autowired註解,程式碼看起來很亂,lombok提供了一個註解:

@RequiredArgsConstructor(onConstructor =@_(@Autowired))

寫在類上可以代替@Autowired註解,需要注意的是在注入時需要用final定義,或者使用@notnull註解

@RestController@RequiredArgsConstructorpublic class LoginTest {// @Autowired private final LoginProperties loginProperties; @RequestMapping(“/login01”) public void loginTest01(){ System。out。println(“進入loginTest01方法~~~”); String language = loginProperties。getLanguage(); System。out。println(language); }}

這樣就可以避免寫入重複的@Autowired了,但是就是需要注意物件必須是final修飾的才行,

總結一下,如果需要將類屬性與配置檔案中的引數繫結,並且注入到容器中時,推薦使用第三種方法和@RequiredArgsConstructor註解來實現!!!

原文地址:https://bbs。huaweicloud。com/blogs/324165?utm_source=51cto&utm_medium=bbs-ex&utm_campaign=other&utm_content=content

原文作者:灰小猿