1. 概要

Spring Boot は、独創的なアルゴリズムを使用して、DataSourceをスキャンして構成します。 これにより、デフォルトで完全に構成されたDataSource実装を簡単に取得できます。

さらに、Spring Bootは、 HikariCP Apache Tomcat 、または CommonsDBCPのいずれかの超高速接続プールを自動的に構成します。クラスパス上にあるものに応じて、順序。

Spring Bootの自動データソース構成はほとんどの場合非常にうまく機能しますが、より高いレベルの制御が必要になる場合があるため、独自のデータソースを設定する必要があります。実装、したがって自動構成プロセスをスキップします。

このチュートリアルでは、Spring Bootでデータソースをプログラムで構成する方法を学習します。

2. Mavenの依存関係

プログラムによるデータソース実装の作成は全体的に簡単です

これを実現する方法を学ぶために、いくつかの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、をテストできるようになります。

さらに、MavenCentralでspring-boot-starter-data-jpaの最新バージョンを確認してください。

3. DataSourceをプログラムで構成する

ここで、Spring Bootの自動 DataSource 構成を維持し、プロジェクトを現在の状態で実行すると、期待どおりに機能します。

Spring Bootは、すべての重いインフラストラクチャの配管を行います。これには、HikariCP、Apache Tomcat、またはCommonsDBCPによって自動的に処理されるH2 DataSource 実装の作成、およびセットアップが含まれます。インメモリデータベースインスタンス。

さらに、 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クラス、非流暢なバージョンの Joseph Blochのビルダーパターンを使用して、カスタム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 で注釈が付けられたクラスを介して定義されたプロパティは、JavaAPIで定義されたプロパティをオーバーライドします。

このアプローチでは、DataSource構成設定を1つの場所に保存しなくなることが明らかになります。

一方、コンパイル時と実行時の構成設定を互いに適切に分離しておくことができます。

これは、構成のバインドポイントを簡単に設定できるため、非常に優れています。 そうすれば、Beanファクトリメソッドをリファクタリングすることなく、他のソースからのさまざまなDataSource設定を含めることができます。

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", "bob@domain.com"));
        List<User> users = (List<User>) userRepository.findAll();
        
        assertThat(users.size()).isEqualTo(1);
    }    
}

UserRepositoryIntegrationTestクラスはかなり自明です。 リポジトリインターフェイスのCRUDメソッドを2つ実行するだけで、エンティティを永続化して検索できます。

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が正常に構成されていることを確認します。 したがって、サンプルアプリケーションを実行すると、データベースに保存されているUserエンティティのリストがコンソール出力に表示されます。

6. 結論

この記事では、 SpringBootでデータソースの実装をプログラムで構成する方法を学びました。

いつものように、この記事に示されているすべてのコードサンプルは、GitHubから入手できます。