Mengonfigurasi Sumber Data Secara Terprogram di Spring Boot

1. Ikhtisar

Spring Boot menggunakan algoritme beropini untuk memindai dan mengkonfigurasi Sumber Data . Hal ini memungkinkan kami untuk dengan mudah mendapatkan implementasi DataSource yang dikonfigurasi sepenuhnya secara default.

Selain itu, Spring Boot secara otomatis mengonfigurasi kumpulan koneksi secepat kilat - baik HikariCP, Apache Tomcat, atau Commons DBCP, dalam urutan itu, tergantung mana yang ada di jalur kelas.

Meskipun konfigurasi Sumber Data otomatis Spring Boot berfungsi dengan sangat baik dalam banyak kasus, terkadang kita memerlukan tingkat kontrol yang lebih tinggi , jadi kita harus menyiapkan implementasi Sumber Data kita sendiri , sehingga melewatkan proses konfigurasi otomatis.

Dalam tutorial ini, kita akan belajar cara mengonfigurasi Sumber Data secara terprogram di Spring Boot .

2. Dependensi Maven

Membuat implementasi DataSource secara terprogram sangatlah mudah, secara keseluruhan .

Untuk mempelajari cara melakukannya, kami akan menerapkan lapisan repositori sederhana, yang akan melakukan operasi CRUD pada beberapa entitas JPA.

Mari kita lihat dependensi proyek demo kami:

 org.springframework.boot spring-boot-starter-data-jpa   com.h2database h2 2.4.1 runtime 

Seperti yang ditunjukkan di atas, kita akan menggunakan instance database H2 dalam memori untuk menjalankan lapisan repositori. Dengan demikian, kami akan dapat menguji Sumber Data yang dikonfigurasi secara terprogram , tanpa biaya untuk melakukan operasi database yang mahal.

Selain itu, pastikan untuk memeriksa versi terbaru spring-boot-starter-data-jpa di Maven Central.

3. Mengonfigurasi Sumber Data Secara Terprogram

Sekarang, jika kita tetap menggunakan konfigurasi Sumber Data otomatis Spring Boot dan menjalankan proyek kita dalam keadaan saat ini, itu hanya akan bekerja seperti yang diharapkan.

Spring Boot akan melakukan semua pipa infrastruktur berat untuk kita. Ini termasuk membuat implementasi H2 DataSource , yang akan secara otomatis ditangani oleh HikariCP, Apache Tomcat, atau Commons DBCP, dan menyiapkan instans database dalam memori.

Selain itu, kami bahkan tidak perlu membuat file application.properties , karena Spring Boot juga akan menyediakan beberapa pengaturan database default.

Seperti yang telah kami sebutkan sebelumnya, terkadang kami memerlukan tingkat penyesuaian yang lebih tinggi, oleh karena itu kami harus mengonfigurasi secara terprogram implementasi Sumber Data kami sendiri .

Cara paling mudah untuk melakukannya adalah dengan mendefinisikan sebuah DataSource metode pabrik, dan menempatkannya dalam kelas dijelaskan dengan @Configuration penjelasan :

@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(); } }

Dalam hal ini, kami menggunakan kenyamanan DataSourceBuilder kelas - versi non-fasih pola pembangun Joshua Bloch - untuk membuat pemrograman kami kustom DataSource objek .

Pendekatan ini sangat bagus karena pembuatnya mempermudah konfigurasi Sumber Data menggunakan beberapa properti umum. Selain itu, ia juga menggunakan kumpulan koneksi yang mendasarinya.

4. Mengeksternalisasikan Konfigurasi Sumber Data dengan File application.properties

Tentu saja, mungkin juga untuk mengeksternalisasi sebagian konfigurasi Sumber Data kami . Misalnya, kami dapat menentukan beberapa properti Sumber Data dasar di metode pabrik kami:

@Bean public DataSource getDataSource() { DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); dataSourceBuilder.username("SA"); dataSourceBuilder.password(""); return dataSourceBuilder.build(); }

Dan tentukan beberapa tambahan di file application.properties :

spring.datasource.url=jdbc:h2:mem:test spring.datasource.driver-class-name=org.h2.Driver 

Properti yang ditentukan dalam sumber eksternal, seperti file application.properties di atas atau melalui kelas yang dianotasi dengan @ConfigurationProperties , akan menggantikan properti yang ditentukan dalam Java API.

Jelaslah bahwa, dengan pendekatan ini, kami tidak lagi menyimpan setelan konfigurasi Sumber Data kami di satu tempat .

Di sisi lain, ini memungkinkan kita untuk menjaga pengaturan konfigurasi waktu kompilasi dan waktu berjalan dengan baik terpisah satu sama lain.

Ini sangat bagus, karena memungkinkan kita untuk dengan mudah mengatur titik pengikatan konfigurasi. Dengan cara itu kami dapat menyertakan pengaturan Sumber Data yang berbeda dari sumber lain, tanpa harus melakukan refaktorisasi pada metode pabrik kacang kami.

5. Menguji Konfigurasi Sumber Data

Menguji konfigurasi Sumber Data khusus kami sangat sederhana. Seluruh proses hanya bermuara pada pembuatan entitas JPA, mendefinisikan antarmuka repositori dasar, dan menguji lapisan repositori.

5.1. Membuat Entitas JPA

Mari kita mulai menentukan kelas entitas JPA sampel kita, yang akan menjadi model pengguna:

@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. Lapisan Repositori Sederhana

Selanjutnya, kita perlu mengimplementasikan lapisan repositori dasar, yang memungkinkan kita melakukan operasi CRUD pada instance kelas entitas Pengguna yang ditentukan di atas.

Karena kami menggunakan Spring Data JPA, kami tidak perlu membuat implementasi DAO kami sendiri dari awal. Kita hanya perlu memperluas antarmuka CrudRepository untuk mendapatkan implementasi repositori yang berfungsi:

@Repository public interface UserRepository extends CrudRepository {} 

5.3. Menguji Lapisan Repositori

Terakhir, kita perlu memeriksa apakah DataSource yang dikonfigurasi secara terprogram benar- benar berfungsi. Kami dapat dengan mudah mencapai ini dengan uji integrasi:

@RunWith(SpringRunner.class) @DataJpaTest public class UserRepositoryIntegrationTest { @Autowired private UserRepository userRepository; @Test public void whenCalledSave_thenCorrectNumberOfUsers() { userRepository.save(new User("Bob", "[email protected]")); List users = (List) userRepository.findAll(); assertThat(users.size()).isEqualTo(1); } }

Kelas UserRepositoryIntegrationTest cukup jelas. Ini hanya melatih dua metode CRUD antarmuka repositori untuk bertahan dan menemukan entitas.

Notice that regardless of whether we decide to programmatically configure our DataSource implementation, or split it into a Java config method and the application.properties file, we should always get a working database connection.

5.4. Running the Sample Application

Finally, we can run our demo application using a standard main() method:

@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); }; } } 

We already tested the repository layer, so we're sure that our DataSource has been configured successfully. Thus, if we run the sample application, we should see in our console output the list of User entities stored in the database.

6. Conclusion

Dalam tutorial ini, kami mempelajari cara mengonfigurasi implementasi Sumber Data secara terprogram di Spring Boot .

Seperti biasa, semua contoh kode yang ditampilkan dalam tutorial ini tersedia di GitHub.