SpringBoot使用編程方式配置DataSource的方法
Spring Boot使用固定算法來(lái)掃描和配置DataSource。這使我們可以在默認(rèn)情況下輕松獲得完全配置的DataSource實(shí)現(xiàn)。
Spring Boot還會(huì)按順序快速的自動(dòng)配置連接池(HikariCP, Apache Tomcat或Commons DBCP),具體取決于路徑中的哪些類(lèi)。
雖然Spring Boot的DataSource自動(dòng)配置在大多數(shù)情況下運(yùn)行良好,但有時(shí)我們需要更高級(jí)別的控制,因此我們必須設(shè)置自己的DataSource實(shí)現(xiàn),因此忽略自動(dòng)配置過(guò)程。
Maven依賴(lài)
總體而言,以編程方式創(chuàng)建DataSource實(shí)現(xiàn)非常簡(jiǎn)單。
為了學(xué)習(xí)如何實(shí)現(xiàn)這一目標(biāo),我們將實(shí)現(xiàn)一個(gè)簡(jiǎn)單的存儲(chǔ)庫(kù)層,它將對(duì)某些JPA實(shí)體執(zhí)行CRUD操作。
我們來(lái)看看我們的演示項(xiàng)目的依賴(lài)項(xiàng):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.4.1</version> <scope>runtime</scope> </dependency>
我們將使用內(nèi)存中的H2數(shù)據(jù)庫(kù)實(shí)例來(lái)運(yùn)行存儲(chǔ)庫(kù)層。通過(guò)這樣做,我們將能夠測(cè)試以編程方式配置的DataSource,而無(wú)需執(zhí)行昂貴的數(shù)據(jù)庫(kù)操作。
讓我們確保在Maven Central上查看最新版本的spring-boot-starter-data-jpa。
配置DataSource
如果我們堅(jiān)持使用Spring Boot的DataSource自動(dòng)配置并以當(dāng)前狀態(tài)運(yùn)行我們的項(xiàng)目,程序?qū)搭A(yù)期工作。
Spring Boot將為我們完成所有重型基礎(chǔ)設(shè)施管道。這包括創(chuàng)建H2 DataSource實(shí)現(xiàn),該實(shí)現(xiàn)將由HikariCP,Apache Tomcat或Commons DBCP自動(dòng)處理,并設(shè)置內(nèi)存數(shù)據(jù)庫(kù)實(shí)例。
此外,我們甚至不需要?jiǎng)?chuàng)建application.properties文件,因?yàn)镾pring Boot也會(huì)提供一些默認(rèn)的數(shù)據(jù)庫(kù)設(shè)置。
正如我們之前提到的,有時(shí)我們需要更高級(jí)別的自定義,因此我們必須以編程方式配置我們自己的DataSource實(shí)現(xiàn)。
實(shí)現(xiàn)此目的的最簡(jiǎn)單方法是定義DataSource工廠方法,并將其放在使用@Configuration注解的類(lèi)中:
@Configuration public class DataSourceConfig { @Bean public DataSource getDataSource() { DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); dataSourceBuilder.driverClassName("org.h2.Driver"); dataSourceBuilder.url("jdbc:h2:mem:test"); dataSourceBuilder.username("SA"); dataSourceBuilder.password(""); return dataSourceBuilder.build(); } }
在這種情況下,我們使用方便的DataSourceBuilder類(lèi) - 一個(gè)簡(jiǎn)潔的Joshua Bloch構(gòu)建器模式 - 以編程方式創(chuàng)建我們的自定義DataSource對(duì)象。
這種方法非常好,因?yàn)闃?gòu)建器可以使用一些常用屬性輕松配置DataSource。此外,它還可以使用底層連接池。
使用application.properties文件外部化DataSource配置
當(dāng)然,也可以部分外部化我們的DataSource配置。例如,我們可以在工廠方法中定義一些基本的DataSource屬性:
@Bean public DataSource getDataSource() { DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); dataSourceBuilder.username("SA"); dataSourceBuilder.password(""); return dataSourceBuilder.build(); }
并在application.properties文件中指定一些額外的配置:
spring.datasource.url=jdbc:h2:mem:test spring.datasource.driver-class-name=org.h2.Driver
在外部源中定義的屬性(例如上面的application.properties文件或通過(guò)使用@ConfigurationProperties注解的類(lèi))將覆蓋Java API中定義的屬性。
很明顯,通過(guò)這種方法,我們不再將DataSource配置設(shè)置保存在一個(gè)地方。
另一方面,它允許我們保持編譯時(shí)和運(yùn)行時(shí)配置彼此并很好地分離。
這非常好,因?yàn)樗试S我們輕松設(shè)置綁定點(diǎn)。這樣我們可以從其他來(lái)源包含不同的DataSource,而無(wú)需重構(gòu)我們的bean工廠方法。
測(cè)試DataSource配置
測(cè)試我們的自定義DataSource配置非常簡(jiǎn)單。整個(gè)過(guò)程歸結(jié)為創(chuàng)建JPA實(shí)體,定義基本存儲(chǔ)庫(kù)接口以及測(cè)試存儲(chǔ)庫(kù)層。
- 創(chuàng)建JPA實(shí)體
讓我們開(kāi)始定義我們的示例JPA實(shí)體類(lèi),它將為用戶(hù)建模:
@Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String name; private String email; // standard constructors / setters / getters / toString }
- 存儲(chǔ)庫(kù)層
我們需要實(shí)現(xiàn)一個(gè)基本的存儲(chǔ)庫(kù)層,它允許我們對(duì)上面定義的User實(shí)體類(lèi)的實(shí)例執(zhí)行CRUD操作。
由于我們使用的是Spring Data JPA,因此我們不必從頭開(kāi)始創(chuàng)建自己的DAO實(shí)現(xiàn)。我們只需要擴(kuò)展CrudRepository接口獲得一個(gè)工作的存儲(chǔ)庫(kù)實(shí)現(xiàn):
@Repository public interface UserRepository extends CrudRepository<User, Long> {}
- 測(cè)試存儲(chǔ)庫(kù)層
最后,我們需要檢查我們的編程配置的DataSource是否實(shí)際工作。我們可以通過(guò)集成測(cè)試輕松完成此任務(wù):
@RunWith(SpringRunner.class) @DataJpaTest public class UserRepositoryIntegrationTest { @Autowired private UserRepository userRepository; @Test public void whenCalledSave_thenCorrectNumberOfUsers() { userRepository.save(new User("Bob", "bob@domain.com")); List<User> users = (List<User>) userRepository.findAll(); assertThat(users.size()).isEqualTo(1); } }
UserRepositoryIntegrationTest類(lèi)是測(cè)試用例。它只是運(yùn)行兩個(gè)存儲(chǔ)庫(kù)接口的CRUD方法來(lái)持久化并查找實(shí)體。
請(qǐng)注意,無(wú)論我們是否決定以編程方式配置DataSource實(shí)現(xiàn),或?qū)⑵洳鸱譃镴ava配置方法和application.properties文件,我們都應(yīng)該始終獲得有效的數(shù)據(jù)庫(kù)連接。
- 運(yùn)行示例應(yīng)用程序
最后,我們可以使用標(biāo)準(zhǔn)的main()方法運(yùn)行我們的演示應(yīng)用程序:
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public CommandLineRunner run(UserRepository userRepository) throws Exception { return (String[] args) -> { User user1 = new User("John", "john@domain.com"); User user2 = new User("Julie", "julie@domain.com"); userRepository.save(user1); userRepository.save(user2); userRepository.findAll().forEach(user -> System.out.println(user); }; } }
我們已經(jīng)測(cè)試了存儲(chǔ)庫(kù)層,因此我們確信我們的DataSource已經(jīng)成功配置。因此,如果我們運(yùn)行示例應(yīng)用程序,我們應(yīng)該在控制臺(tái)輸出中看到存儲(chǔ)在數(shù)據(jù)庫(kù)中的User實(shí)體列表。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring boot redis cache的key的使用方法
這篇文章主要介紹了Spring boot redis cache的key的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05關(guān)于SpringBoot攔截器中Bean無(wú)法注入的問(wèn)題
這兩天遇到SpringBoot攔截器中Bean無(wú)法注入問(wèn)題。下面介紹關(guān)于SpringBoot攔截器中Bean無(wú)法注入的問(wèn)題,感興趣的朋友一起看看吧2021-10-10Java根據(jù)URL下載文件到本地的2種方式(大型文件與小型文件)
這篇文章主要給大家介紹了關(guān)于Java根據(jù)URL下載文件到本地的2種方式,分別是大型文件與小型文件,避免內(nèi)存溢出OOM,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01SpringBoot2 實(shí)現(xiàn)JPA分頁(yè)和排序分頁(yè)的案例
這篇文章主要介紹了SpringBoot2 實(shí)現(xiàn)JPA分頁(yè)和排序分頁(yè)的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01Spring Cloud負(fù)載均衡及遠(yuǎn)程調(diào)用實(shí)現(xiàn)詳解
這篇文章主要介紹了Spring Cloud負(fù)載均衡及遠(yuǎn)程調(diào)用實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08SpringCloud應(yīng)用idea實(shí)現(xiàn)可相互調(diào)用的多模塊程序詳解
IDEA 全稱(chēng) IntelliJ IDEA,是java編程語(yǔ)言的集成開(kāi)發(fā)環(huán)境。IntelliJ在業(yè)界被公認(rèn)為最好的Java開(kāi)發(fā)工具,尤其在智能代碼助手、代碼自動(dòng)提示、重構(gòu)、JavaEE支持、各類(lèi)版本工具(git、svn等)、JUnit、CVS整合、代碼分析、 創(chuàng)新的GUI設(shè)計(jì)等方面的功能可以說(shuō)是超常的2022-07-07java秒殺系統(tǒng)常見(jiàn)問(wèn)題庫(kù)存超賣(mài)解決實(shí)例分析
這篇文章主要為大家介紹了java秒殺系統(tǒng)常見(jiàn)問(wèn)題庫(kù)存超賣(mài)解決實(shí)例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11pagehelper插件顯示total為-1或1的問(wèn)題
這篇文章主要介紹了pagehelper插件顯示total為-1或1,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09