知識庫 / Spring / Spring Boot RSS 訂閱

在 Spring Boot 中編程配置 DataSource

Spring Boot,Spring Data
HongKong
10
01:32 PM · Dec 06 ,2025

1. 概述

Spring Boot 使用一種帶有預設的算法來掃描並配置一個 <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.sql/javax/sql/DataSource.html"><em >DataSource</em></a>。 這使我們能夠通過默認方式輕鬆獲得一個完全配置好的DataSource 實現。

此外,Spring Boot 自動配置了一個快速的連接池,要麼是 HikariCP,要麼是 Apache Tomcat,要麼是 Commons DBCP,具體取決於 classpath 上有哪些。

雖然 Spring Boot 的自動 <em >DataSource</em></a> 配置在大多數情況下都非常有效,但有時我們需要更高的控制水平,因此我們需要設置自己的DataSource 實現,從而跳過自動配置過程。

在本教程中,我們將學習如何在 Spring Boot 中通過編程配置 `DataSource 的方法。

2. Maven 依賴項

創建可編程的 <em/>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 數據庫 實例來測試倉庫層。 這樣做可以測試我們通過編程配置的 DataSource,而無需執行昂貴的數據庫操作。

此外,請確保檢查 spring-boot-starter-data-jpa 的最新版本,該版本位於 Maven Central。

3. 手動配置 DataSource 方案

如果堅持使用 Spring Boot 的自動 DataSource 配置並運行我們的項目,它將按預期工作。

Spring Boot 將為我們處理所有繁重的基礎設施管道。 這包括創建 H2 DataSource 實現,該實現將由 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 的 builder 模式的非流式版本,用於通過編程方式創建我們自定義的 DataSource 對象。

這種方法非常實用,因為它使得通過配置一些常見屬性來配置 DataSource 變得容易。它還使用了底層的連接池。

4. 使用 application.properties 文件外部化 DataSource 配置

當然,我們也可以部分外部化 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 配置

測試我們自定義的 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", "[email protected]"));
        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", "[email protected]");
            User user2 = new User("Julie", "[email protected]");
            userRepository.save(user1);
            userRepository.save(user2);
            userRepository.findAll().forEach(user -> System.out.println(user);
        };
    }
}

我們已經測試了倉庫層,因此確信我們的 DataSource 已成功配置。因此,如果運行示例應用程序,我們應該在控制枱輸出中看到數據庫中存儲的 User 實體列表。

6. 結論

在本文中,我們學習瞭如何在 Spring Boot 中通過編程方式配置 DataSource 實現

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.