Spring BootでのプログラムによるDataSourceの構成

1. 概要

link:/spring-boot[Spring Boot]は、独自のアルゴリズムを使用して、https://docs.oracle.com/javase/8/docs/api/javax/sql/DataSourceをスキャンおよび構成します。 .html [_DataSource_]。 これにより、デフォルトで完全に構成された_DataSource_実装を簡単に取得できます。
さらに、Spring Bootは自動的に超高速のlink:/java-connection-pooling[connection pool] – link:/hikaricp[HikariCP]、httpsを構成します。 ://www.baeldung.com/spring-boot-tomcat-connection-pool [Apache Tomcat]、またはhttps://commons.apache.org/proper/commons-dbcp/[Commons DBCP]、この順番でクラスパス上にあります。
*ほとんどの場合、Spring Bootの自動_DataSource_設定は非常にうまく機能しますが、場合によってはより高いレベルの制御が必要になることがあります*。したがって、独自の_DataSource_実装をセットアップする必要があるため、自動設定プロセスをスキップします。
このチュートリアルでは、* Spring Bootで_DataSource_をプログラムで設定する方法を学習します*。

参考文献:

Spring JPA –複数のデータベース

複数の別個のデータベースで動作するようにSpring Data JPAをセットアップする方法。
link:/spring-data-jpa-multiple-databases [詳細]↠’

link:/spring-testing-separate-data-source [テスト用の個別のSpring DataSourceの構成]

Springアプリケーションでのテスト用に個別のデータソースを構成する方法に関する、迅速で実用的なチュートリアル。
link:/spring-testing-separate-data-source [詳細]↠’

2. Mavenの依存関係

*プログラムで_DataSource_実装を作成するのは、全体的に簡単です*。
これを達成する方法を学ぶために、いくつかのlink:/the-persistence-layer-with-spring-and-jpa[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>
上記のように、インメモリhttps://search.maven.org/search?q=g:org.hsqldb%20AND%20a:hsqldb[H2 database]インスタンスを使用して、リポジトリレイヤーを実行します。 そうすることで、高価なデータベース操作を実行するコストなしで、プログラムで構成された_DataSource、_をテストできます。
また、_https://search.maven.org/search?q = g:org.springframework.boot%20AND%20a:spring-boot-starter-data-jpa [spring- Maven Centralのboot-starter-data-jpa] _。

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

*
さて、Spring Bootの自動_DataSource_構成に固執し、現在の状態でプロジェクトを実行すると、期待どおりに機能します。
  • Spring Bootは、すべての重いインフラストラクチャの配管を行います。*これには、HikariCP、Apache Tomcat、またはCommons DBCPによって自動的に処理されるH2 _DataSource_実装の作成、およびインメモリデータベースインスタンスの設定が含まれます。

    さらに、Spring Bootはデフォルトのデータベース設定も提供するため、_application.properties_ファイルを作成する必要さえありません。
    前述したように、時には高度なカスタマイズが必要になるため、独自の_DataSource_実装をプログラムで構成する必要があります。
    *これを実現する最も簡単な方法は、_DataSource_ factoryメソッドを定義し、https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/アノテーションが付けられたクラス内に配置することです。 context / annotation / Configuration.html [_ @ 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();
    }
}
この場合、*便利な_https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/jdbc/DataSourceBuilder.html [DataSourceBuilder] _ class *を使用しました*非流versionなバージョンのhttps://www.pearson.com/us/higher-education/program/Bloch-Effective-Java-3rd-Edition/PGM1763855.html [ジョシュアブロッホのビルダーパターン]— *カスタム_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_ファイルなど、またはlink:/configuration-properties-in-spring-boot[[email protected]_]アノテーションが付けられたクラスを介して、外部ソースで定義されたプロパティがオーバーライドされますJava APIで定義されているもの。*
このアプローチを使用すると、_DataSource_構成設定を1か所に保存しなくなることが明らかになります**。**
一方、それにより、コンパイル時と実行時の構成設定を互いにうまく分離することができます。
これは、構成バインディングポイントを簡単に設定できるため、非常に優れています。 そうすれば、Beanファクトリメソッドをリファクタリングすることなく、他のソースからのさまざまな_DataSource_設定を含めることができます。

5. _DataSource_構成のテスト

カスタム_DataSource_構成のテストは非常に簡単です。 プロセス全体は、https://www.baeldung.com/the-persistence-layer-with-spring-and-jpa [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操作を実行できます。
link:/the-persistence-layer-with-spring-data-jpa[Spring Data JPA]を使用しているため、独自のhttps://www.baeldungを作成する必要はありません。 .com / java-dao-pattern [DAO]実装をゼロから。 動作するリポジトリ実装を取得するには、https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html [_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_クラスは一目瞭然です。 単に、リポジトリインターフェースの2つのCRUDメソッドを実行して、エンティティを永続化および検索します。
*プログラムで_DataSource_実装を構成するか、Java configメソッドと_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_実装をプログラムで構成する方法を学習しました*。
いつものように、このチュートリアルに示されているすべてのコードサンプルはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-boot-persistence[GitHubで]から入手できます。