1. 概述
Spring Boot使用自以為是的算法來掃描和配置 DataSource。這使我們可以輕松獲得默認情況下完全配置的DataSource實現。
此外,Spring Boot 會自動配置一個閃電般快速的連接池,HikariCP、 Apache Tomcat或Commons DBCP,根據類路徑上的順序。
盡管 Spring Boot 的自動DataSource配置在大多數情況下運行良好,但有時我們需要更高級別的控制,因此我們必須設置自己的DataSource實現,因此跳過自動配置過程。
在本教程中,我們將學習如何在 Spring Boot 中以編程方式配置數據源。
2. Maven 依賴
總體而言,以編程方式創建DataSource實現非常簡單。
為了了解如何實現這一點,我們將實現一個簡單的存儲庫層,它將對一些JPA實體執行 CRUD 操作。
讓我們來看看我們的演示項目的依賴項:
<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>
如上所示,我們將使用內存中的H2 數據庫實例來練習存儲庫層。通過這樣做,我們將能夠測試我們以編程方式配置的數據源,而無需執行昂貴的數據庫操作。
此外,讓我們確保在 Maven Central 上檢查最新版本的
spring-boot-starter-data-jpa。
3. 以編程方式配置數據源
現在,如果我們堅持使用 Spring Boot 的自動DataSource配置并在當前狀態下運行我們的項目,它將按預期工作。
Spring Boot 將為我們完成所有繁重的基礎設施管道。這包括創建一個 H2數據源實現,它將由 HikariCP、Apache Tomcat 或 Commons DBCP 自動處理,并設置一個內存數據庫實例。
此外,我們甚至不需要創建application.properties文件,因為 Spring Boot 也會提供一些默認的數據庫設置。
正如我們之前提到的,有時我們需要更高級別的自定義,因此我們必須以編程方式配置我們自己的DataSource實現。
實現這一點的最簡單方法是定義一個 DataSource工廠方法,并將其放置在一個用@Configuration注解注解的類中:
@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類,這是Joshua Bloch 構建器模式的非流暢版本,以編程方式創建我們的自定義DataSource對象。
這種方法非常好,因為構建器可以使用一些常用屬性輕松配置數據源。它也使用底層連接池。
4.使用application.properties文件外部化數據源配置
當然,也可以部分外部化我們的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文件,或通過用@ConfigurationProperties注釋的類,將覆蓋 Java API 中定義的屬性。
很明顯,使用這種方法,我們將不再將DataSource配置設置存儲在一個地方。
另一方面,它允許我們將編譯時和運行時配置設置很好地相互分離。
這真的很好,因為它允許我們輕松設置配置綁定點。這樣我們就可以包含來自其他來源的不同DataSource設置,而無需重構我們的 bean 工廠方法。
5. 測試數據源配置
測試我們的自定義DataSource配置非常簡單。整個過程歸結為創建JPA實體、定義基本存儲庫接口和測試存儲庫層。
5.1. 創建 JPA 實體
讓我們從定義我們的示例 JPA 實體類開始,它將為用戶建模:
@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
}
5.2. 一個簡單的存儲庫層
接下來我們需要實現一個基本的存儲庫層,它允許我們對上面定義的User實體類的實例執行 CRUD 操作。
由于我們使用的是Spring Data JPA,因此我們不必從頭開始創建自己的DAO實現。我們只需要擴展CrudRepository接口即可獲得有效的存儲庫實現:
@Repository
public interface UserRepository extends CrudRepository<User, Long> {}
5.3. 測試存儲庫層
最后,我們需要檢查我們以編程方式配置的DataSource是否確實在工作。我們可以通過集成測試輕松實現這一點:
@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類是不言自明。它只是使用兩個存儲庫接口的 CRUD 方法來持久化和查找實體。
請注意,無論我們決定以編程方式配置我們的DataSource實現,還是將其拆分為 Java 配置方法和application.properties文件,我們都應該始終獲得有效的數據庫連接。
5.4. 運行示例應用程序
最后,我們可以使用標準的main()方法運行我們的演示應用程序:
@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);
};
}
}
我們已經測試了存儲庫層,因此我們確定我們的DataSource已成功配置。因此,如果我們運行示例應用程序,我們應該在控制臺輸出中看到存儲在數據庫中的用戶實體列表。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。