詳解springboot的多種配置方式
java配置主要靠java類和一些注解,比較常用的注解有:
@Configuration :聲明一個(gè)類作為配置類,代替xml文件
@Bean :聲明在方法上,將方法的返回值加入Bean容器,代替 標(biāo)簽
@Value :基本類型或String屬性注入
@PropertySource :指定外部屬性文件
后面以Druid連接池配置為例,數(shù)據(jù)庫名稱為springboot_test
方式一
<!--pom.xml --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
# src/resources/jdbc.properties jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/bos jdbc.username=root jdbc.password=123456
//src\main\java\com\itheima\config\DruidConfig.java
@Configuration
@PropertySource("classpath:jdbc.properties")
public class DruidConfig {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
解讀:
@Configuration :聲明我們 DruidConfig是一個(gè)配置類
@PropertySource :指定屬性文件的路徑是: classpath:jdbc.properties
@Value 為屬性注入值(只能是基本類型或String)
@Bean將 dataSource() 方法聲明為一個(gè)注冊Bean的方法,Spring會自動調(diào)用該方法,將方法的返回值加入Spring容器中。
方式二
<!--pom.xml --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- ============不添加在IDEA 會報(bào)紅,但并不影響功能 ================= --> <dependency> <groupId> org.springframework.boot </groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!--============================================================== -->
# src/resources/application.properties jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/bos jdbc.username=root jdbc.password=123456
//src\main\java\com\itheima\config\DruidConfig.java
@ConfigurationProperties(prefix = "jdbc")
public class DruidProperties {
private String url;
private String driverClassName;
private String username;
private String password;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
//src\main\java\com\itheima\config\DruidConfig.java
@Configuration
@EnableConfigurationProperties(DruidProperties.class)
public class DruidConfig {
@Bean
public DataSource dataSource(DruidProperties dp) {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(dp.getDriverClassName());
dataSource.setUrl(dp.getUrl());
dataSource.setUsername(dp.getUsername());
dataSource.setPassword(dp.getPassword());
return dataSource;
}
}
解讀:
@ConfifigurationProperties注解聲明當(dāng)前類為屬性讀取類,在類上定義各個(gè)屬性,名稱必須與屬性文件中 jdbc. 后面部分一致。
@EnableConfigurationProperties()聲明要使用的屬性讀取類,使用該類有三種注入方式
@Autowired注入
//src\main\java\com\itheima\config\DruidConfig.java
@Configuration
@EnableConfigurationProperties(DruidProperties.class)
public class DruidConfig {
@Autowired
private DruidProperties dp;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
//setter
return dataSource;
}
}
構(gòu)造函數(shù)注入
作為
//src\main\java\com\itheima\config\DruidConfig.java
@Configuration
@EnableConfigurationProperties(DruidProperties.class)
public class DruidConfig {
private DruidProperties dp;
public DruidConfig(DruidProperties dp){ this.dp = dp; }
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
//setter
return dataSource;
}
}
@Bean的方法參數(shù)注入(本例使用)
//src\main\java\com\itheima\config\DruidConfig.java
@Configuration
@EnableConfigurationPerProperties(DruidProperties.class)
public class DruidConfig {
@Bean
public DataSource dataSource(DruidProperties dp) {
DruidDataSource dataSource = new DruidDataSource();
//setter
return dataSource;
}
}
方式二通過屬性讀取類解決了@Value不能讀取對象屬性(如user.friend.name)的問題,但似乎就更加麻煩了
方式三(推薦使用)
事實(shí)上,如果一段屬性只有一個(gè)Bean需要使用,我們無需將其注入到一個(gè)類。
<!--pom.xml --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- ============不添加在IDEA 會報(bào)紅,但并不影響功能 ================= --> <dependency> <groupId> org.springframework.boot </groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!--============================================================== -->
# src/resources/application.properties jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/bos jdbc.username=root jdbc.password=123456
@Configuration
public class DruidConfig {
@Bean
@ConfigurationProperties(prefix = "jdbc")
public DataSource dataSource() {
return new DruidDataSource();
}
}
方式四
<!--pom.xml --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
# src/resources/application.properties spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/bos spring.datasource.username=root spring.datasource.password=123456
思考:為什么這種方式不需要配置類可以讀取配置信息?
啟動類跑main方法時(shí)候,查看SpringApplication構(gòu)造方法,如下追蹤




容易發(fā)現(xiàn),它是從 META-INF/spring.factories 中獲取類名信息,存儲在一鍵多值的Map中,打開spring.factories,debug對比

發(fā)現(xiàn)鍵是文件藍(lán)色部分,值是綠色部分,往回看不難發(fā)現(xiàn)它將這些獲取的類都生成了實(shí)例,注入到IOC容器中。
打開 DataSourceProperties 發(fā)現(xiàn)這不是方式二嗎?

點(diǎn)進(jìn)DataSourceProperties.class

總結(jié):當(dāng)我們添加依賴后,執(zhí)行啟動類時(shí)自動加載DataSourceAutoConfiguration,讀取DataSourceProperties類,根據(jù)默認(rèn)的前綴spring.datasource在application.xml中讀取信息
到此這篇關(guān)于springboot的多種配置方式的文章就介紹到這了,更多相關(guān)springboot配置方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java異常處理UncaughtExceptionHandler使用實(shí)例代碼詳解
當(dāng)一個(gè)線程由于未捕獲異常即將終止時(shí),Java虛擬機(jī)將使用thread . getuncaughtexceptionhandler()查詢線程的uncaughtException處理程序,并調(diào)用處理程序的uncaughtException方法,將線程和異常作為參數(shù)傳遞2023-03-03
Java實(shí)現(xiàn)文件上傳與文件下載的示例代碼
在開發(fā)中項(xiàng)目難免會遇到文件上傳和下載的情況,這篇文章主要為大家詳細(xì)介紹了Java中實(shí)現(xiàn)文件上傳與文件下載的示例代碼,希望對大家有所幫助2023-07-07
java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決
這篇文章主要給大家介紹了關(guān)于java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決辦法,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-02-02
SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)方式
這篇文章主要介紹了SpringBoot@Aspect 打印訪問請求和返回?cái)?shù)據(jù)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
JavaWeb項(xiàng)目實(shí)現(xiàn)文件上傳動態(tài)顯示進(jìn)度實(shí)例
本篇文章主要介紹了JavaWeb項(xiàng)目實(shí)現(xiàn)文件上傳動態(tài)顯示進(jìn)度實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04
Java中遍歷集合的并發(fā)修改異常解決方案實(shí)例代碼
當(dāng)你遍歷集合的同時(shí),又往集合中添加或者刪除元素,就可能報(bào)并發(fā)修改異常,下面這篇文章主要給大家介紹了關(guān)于Java中遍歷集合的并發(fā)修改異常解決方案的相關(guān)資料,需要的朋友可以參考下2022-12-12
Java實(shí)現(xiàn)手寫一個(gè)線程池的示例代碼
線程池技術(shù)想必大家都不陌生把,相信在平時(shí)的工作中沒有少用,而且這也是面試頻率非常高的一個(gè)知識點(diǎn),那么大家知道它的實(shí)現(xiàn)原理和細(xì)節(jié)嗎?本文就來通過手寫一個(gè)簡單的線程池框架,去掌握線程池的基本原理,感興趣的可以學(xué)習(xí)一下2022-10-10
Java復(fù)制一個(gè)對象并且不想復(fù)制其中的空值屬性問題
這篇文章主要介紹了Java復(fù)制一個(gè)對象并且不想復(fù)制其中的空值屬性問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08

