詳解springboot的多種配置方式
java配置主要靠java類(lèi)和一些注解,比較常用的注解有:
@Configuration :聲明一個(gè)類(lèi)作為配置類(lèi),代替xml文件
@Bean :聲明在方法上,將方法的返回值加入Bean容器,代替 標(biāo)簽
@Value :基本類(lèi)型或String屬性注入
@PropertySource :指定外部屬性文件
后面以Druid連接池配置為例,數(shù)據(jù)庫(kù)名稱(chēng)為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è)配置類(lèi)
@PropertySource :指定屬性文件的路徑是: classpath:jdbc.properties
@Value 為屬性注入值(只能是基本類(lèi)型或String)
@Bean將 dataSource() 方法聲明為一個(gè)注冊(cè)Bean的方法,Spring會(huì)自動(dòng)調(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 會(huì)報(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)前類(lèi)為屬性讀取類(lèi),在類(lèi)上定義各個(gè)屬性,名稱(chēng)必須與屬性文件中 jdbc. 后面部分一致。
@EnableConfigurationProperties()聲明要使用的屬性讀取類(lèi),使用該類(lèi)有三種注入方式
@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; } }
方式二通過(guò)屬性讀取類(lèi)解決了@Value不能讀取對(duì)象屬性(如user.friend.name)的問(wèn)題,但似乎就更加麻煩了
方式三(推薦使用)
事實(shí)上,如果一段屬性只有一個(gè)Bean需要使用,我們無(wú)需將其注入到一個(gè)類(lèi)。
<!--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 會(huì)報(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
思考:為什么這種方式不需要配置類(lèi)可以讀取配置信息?
啟動(dòng)類(lèi)跑main方法時(shí)候,查看SpringApplication構(gòu)造方法,如下追蹤
容易發(fā)現(xiàn),它是從 META-INF/spring.factories 中獲取類(lèi)名信息,存儲(chǔ)在一鍵多值的Map中,打開(kāi)spring.factories,debug對(duì)比
發(fā)現(xiàn)鍵是文件藍(lán)色部分,值是綠色部分,往回看不難發(fā)現(xiàn)它將這些獲取的類(lèi)都生成了實(shí)例,注入到IOC容器中。
打開(kāi) DataSourceProperties 發(fā)現(xiàn)這不是方式二嗎?
點(diǎn)進(jìn)DataSourceProperties.class
總結(jié):當(dāng)我們添加依賴(lài)后,執(zhí)行啟動(dòng)類(lèi)時(shí)自動(dòng)加載DataSourceAutoConfiguration,讀取DataSourceProperties類(lèi),根據(jù)默認(rèn)的前綴spring.datasource在application.xml中讀取信息
到此這篇關(guān)于springboot的多種配置方式的文章就介紹到這了,更多相關(guān)springboot配置方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java設(shè)計(jì)模式之簡(jiǎn)單工廠(chǎng)模式詳解
這篇文章主要介紹了java設(shè)計(jì)模式之簡(jiǎn)單工廠(chǎng)模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Java異常處理UncaughtExceptionHandler使用實(shí)例代碼詳解
當(dāng)一個(gè)線(xiàn)程由于未捕獲異常即將終止時(shí),Java虛擬機(jī)將使用thread . getuncaughtexceptionhandler()查詢(xún)線(xiàn)程的uncaughtException處理程序,并調(diào)用處理程序的uncaughtException方法,將線(xiàn)程和異常作為參數(shù)傳遞2023-03-03Java實(shí)現(xiàn)文件上傳與文件下載的示例代碼
在開(kāi)發(fā)中項(xiàng)目難免會(huì)遇到文件上傳和下載的情況,這篇文章主要為大家詳細(xì)介紹了Java中實(shí)現(xiàn)文件上傳與文件下載的示例代碼,希望對(duì)大家有所幫助2023-07-07java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決
這篇文章主要給大家介紹了關(guān)于java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-02-02SpringBoot@Aspect 打印訪(fǎng)問(wèn)請(qǐng)求和返回?cái)?shù)據(jù)方式
這篇文章主要介紹了SpringBoot@Aspect 打印訪(fǎng)問(wèn)請(qǐng)求和返回?cái)?shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09JavaWeb項(xiàng)目實(shí)現(xiàn)文件上傳動(dòng)態(tài)顯示進(jìn)度實(shí)例
本篇文章主要介紹了JavaWeb項(xiàng)目實(shí)現(xiàn)文件上傳動(dòng)態(tài)顯示進(jìn)度實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04Java中遍歷集合的并發(fā)修改異常解決方案實(shí)例代碼
當(dāng)你遍歷集合的同時(shí),又往集合中添加或者刪除元素,就可能報(bào)并發(fā)修改異常,下面這篇文章主要給大家介紹了關(guān)于Java中遍歷集合的并發(fā)修改異常解決方案的相關(guān)資料,需要的朋友可以參考下2022-12-12基于Spring@Autowired注解與自動(dòng)裝配詳談
下面小編就為大家?guī)?lái)一篇基于Spring@Autowired注解與自動(dòng)裝配詳談。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Java實(shí)現(xiàn)手寫(xiě)一個(gè)線(xiàn)程池的示例代碼
線(xiàn)程池技術(shù)想必大家都不陌生把,相信在平時(shí)的工作中沒(méi)有少用,而且這也是面試頻率非常高的一個(gè)知識(shí)點(diǎn),那么大家知道它的實(shí)現(xiàn)原理和細(xì)節(jié)嗎?本文就來(lái)通過(guò)手寫(xiě)一個(gè)簡(jiǎn)單的線(xiàn)程池框架,去掌握線(xiàn)程池的基本原理,感興趣的可以學(xué)習(xí)一下2022-10-10Java復(fù)制一個(gè)對(duì)象并且不想復(fù)制其中的空值屬性問(wèn)題
這篇文章主要介紹了Java復(fù)制一個(gè)對(duì)象并且不想復(fù)制其中的空值屬性問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08