Mengkonfigurasi Sumber Data secara Programatik dalam Spring Boot

1. Gambaran keseluruhan

Spring Boot menggunakan algoritma pendapat untuk mengimbas dan mengkonfigurasi Sumber Data . Ini membolehkan kita mendapatkan pelaksanaan DataSource yang dikonfigurasikan dengan mudah secara lalai.

Di samping itu, Spring Boot secara automatik mengkonfigurasi kumpulan sambungan sepantas kilat - baik HikariCP, Apache Tomcat, atau Commons DBCP, dalam urutan itu, bergantung pada yang ada di jalan kelas.

Walaupun konfigurasi DataSource automatik Spring Boot berfungsi dengan baik dalam kebanyakan kes, kadang-kadang kita memerlukan tahap kawalan yang lebih tinggi , jadi kita harus mengatur pelaksanaan DataSource kita sendiri , sehingga melewatkan proses konfigurasi automatik.

Dalam tutorial ini, kita akan belajar bagaimana mengkonfigurasi DataSource secara terprogram di Spring Boot .

2. Pergantungan Maven

Membuat pelaksanaan DataSource secara teratur adalah mudah, secara keseluruhan .

Untuk mengetahui bagaimana mencapainya, kami akan melaksanakan lapisan repositori sederhana, yang akan melakukan operasi CRUD pada beberapa entiti JPA.

Mari lihat kebergantungan projek demo kami:

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

Seperti yang ditunjukkan di atas, kami akan menggunakan contoh pangkalan data H2 dalam memori untuk menjalankan lapisan repositori. Dengan berbuat demikian, kami akan dapat menguji DataSource yang dikonfigurasi secara program, tanpa kos melakukan operasi pangkalan data yang mahal.

Selain itu, mari kita periksa versi terbaru spring-boot-starter-data-jpa di Maven Central.

3. Mengkonfigurasi Sumber Data Secara Berprogram

Sekarang, jika kita mengikuti konfigurasi DataSource automatik Spring Boot dan menjalankan projek kita dalam keadaannya sekarang, ia akan berfungsi seperti yang diharapkan.

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

Selain itu, kita tidak perlu membuat fail application.properties , kerana Spring Boot juga akan menyediakan beberapa tetapan pangkalan data lalai.

Seperti yang kami sebutkan sebelumnya, kadang-kadang kami memerlukan tahap penyesuaian yang lebih tinggi, oleh itu kami harus mengkonfigurasi secara teratur pelaksanaan DataSource kami sendiri .

Cara termudah untuk mencapainya adalah dengan menentukan kaedah kilang DataSource , dan meletakkannya dalam kelas yang diberi anotasi @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(); } }

Dalam kes ini, kami menggunakan kemudahan yang DataSourceBuilder kelas - versi bukan fasih daripada pola pembina Joshua Bloch - untuk mewujudkan pengaturcaraan adat kami sumber data objek .

Pendekatan ini sangat bagus kerana pembangun memudahkan untuk mengkonfigurasi Sumber Data menggunakan beberapa sifat biasa. Selain itu, ia juga menggunakan kumpulan sambungan yang mendasari.

4. Meluar Konfigurasi DataSource dengan File application.properties

Sudah tentu, mungkin juga sebahagian dari luaran konfigurasi DataSource kami . Sebagai contoh, kami dapat menentukan beberapa sifat asas DataSource dalam kaedah kilang kami:

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

Dan tentukan beberapa tambahan dalam fail application.properties :

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

Properti yang ditentukan dalam sumber luaran, seperti file application.properties di atas atau melalui kelas yang diberi penjelasan dengan @ConfigurationProperties , akan menggantikan yang ditentukan dalam API Java.

Menjadi jelas bahawa, dengan pendekatan ini, kami tidak lagi menyimpan tetapan konfigurasi DataSource kami di satu tempat .

Di sisi lain, ini membolehkan kita menyimpan tetapan konfigurasi waktu kompilasi dan masa berjalan yang terpisah antara satu sama lain.

Ini benar-benar baik, kerana ia membolehkan kita menetapkan titik pengikatan konfigurasi dengan mudah. Dengan cara itu kita dapat memasukkan tetapan DataSource yang berbeza dari sumber lain, tanpa perlu memfaktorkan semula kaedah kilang kacang.

5. Menguji Konfigurasi DataSource

Menguji konfigurasi DataSource kami sangat mudah. Seluruh proses hanya bermula untuk membuat entiti JPA, menentukan antara muka repositori asas, dan menguji lapisan repositori.

5.1. Membuat Entiti JPA

Mari mula menentukan contoh kelas entiti JPA kami, yang akan memodelkan 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 Mudah

Seterusnya, kita perlu menerapkan lapisan repositori asas, yang membolehkan kita melakukan operasi CRUD pada contoh kelas entiti Pengguna yang ditentukan di atas.

Oleh kerana kita menggunakan Spring Data JPA, kita tidak perlu membuat pelaksanaan DAO kita sendiri dari awal. Kita hanya perlu memperluaskan antara muka CrudRepository untuk mendapatkan pelaksanaan repositori yang berfungsi:

@Repository public interface UserRepository extends CrudRepository {} 

5.3. Menguji Lapisan Repositori

Terakhir, kita perlu memastikan bahawa DataSource yang dikonfigurasikan secara program sebenarnya berfungsi. Kami dapat melakukannya dengan mudah dengan ujian 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); } }

The UserRepositoryIntegrationTest kelas adalah agak jelas dengan sendirinya. Ia hanya menggunakan dua kaedah CRUD antara muka repositori untuk bertahan dan mencari entiti.

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 belajar bagaimana mengkonfigurasi pelaksanaan DataSource secara terprogram di Spring Boot .

Seperti biasa, semua contoh kod yang ditunjukkan dalam tutorial ini terdapat di GitHub.