Membuat Custom Starter dengan Spring Boot

1. Ikhtisar

Pengembang inti Spring Boot menyediakan permulaan untuk sebagian besar proyek open source populer, tetapi kami tidak terbatas pada ini.

Kami juga dapat menulis permulaan kustom kami sendiri . Jika kita memiliki pustaka internal untuk digunakan dalam organisasi kita, akan menjadi praktik yang baik untuk juga menulis permulaannya jika itu akan digunakan dalam konteks Spring Boot.

Pemula ini memungkinkan pengembang untuk menghindari konfigurasi yang panjang dan dengan cepat memulai pengembangan mereka. Namun, dengan banyak hal yang terjadi di latar belakang, terkadang menjadi sulit untuk memahami bagaimana anotasi atau hanya menyertakan ketergantungan di pom.xml memungkinkan begitu banyak fitur.

Dalam artikel ini, kami akan mengungkap keajaiban Spring Boot untuk melihat apa yang terjadi di balik layar. Kemudian kita akan menggunakan konsep ini untuk membuat starter untuk pustaka kustom kita sendiri.

2. Mengungkap Konfigurasi Otomatis Spring Boot

2.1. Kelas Konfigurasi Otomatis

Saat Spring Boot dijalankan, program akan mencari file bernama spring.factories di classpath. File ini terletak di direktori META-INF . Mari kita lihat cuplikan file ini dari proyek spring-boot-autoconfigure:

# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

File ini memetakan nama ke kelas konfigurasi berbeda yang akan coba dijalankan Spring Boot. Jadi, sesuai potongan ini, Spring Boot akan mencoba menjalankan semua kelas konfigurasi untuk RabbitMQ, Cassandra, MongoDB, dan Hibernate.

Apakah kelas-kelas ini benar-benar akan dijalankan atau tidak akan bergantung pada keberadaan kelas-kelas dependen pada classpath. Misalnya, jika kelas untuk MongoDB ditemukan di jalur kelas, MongoAutoConfiguration akan berjalan dan semua kacang terkait mongo akan diinisialisasi.

Inisialisasi bersyarat ini diaktifkan oleh anotasi @ConditionalOnClass . Mari kita lihat cuplikan kode dari kelas MongoAutoConfiguration untuk melihat penggunaannya:

@Configuration @ConditionalOnClass(MongoClient.class) @EnableConfigurationProperties(MongoProperties.class) @ConditionalOnMissingBean(type = "org.springframework.data.mongodb.MongoDbFactory") public class MongoAutoConfiguration { // configuration code }

Sekarang bagaimana - jika MongoClient tersedia di classpath - kelas konfigurasi ini akan berjalan mengisi pabrik kacang Spring dengan MongoClient diinisialisasi dengan pengaturan konfigurasi default.

2.2. Properti Khusus dari File application.properties

Spring Boot menginisialisasi kacang menggunakan beberapa default yang telah dikonfigurasi sebelumnya. Untuk mengganti default tersebut, kami biasanya mendeklarasikannya di file application.properties dengan nama tertentu. Properti ini secara otomatis diambil oleh wadah Spring Boot.

Mari kita lihat cara kerjanya.

Dalam cuplikan kode untuk MongoAutoConfiguration , anotasi @EnableConfigurationProperties dideklarasikan dengan kelas MongoProperties yang bertindak sebagai penampung untuk properti khusus:

@ConfigurationProperties(prefix = "spring.data.mongodb") public class MongoProperties { private String host; // other fields with standard getters and setters }

Awalan ditambah nama kolom membuat nama properti di file application.properties . Jadi, untuk mengatur host untuk MongoDB, kita hanya perlu menulis yang berikut ini di file properti:

spring.data.mongodb.host = localhost

Demikian pula, nilai untuk bidang lain di kelas dapat disetel menggunakan file properti.

3. Membuat Custom Starter

Berdasarkan konsep di bagian 2, untuk membuat custom starter kita perlu menulis komponen berikut:

  1. Kelas konfigurasi otomatis untuk perpustakaan kami bersama dengan kelas properti untuk konfigurasi khusus.
  2. Sebuah pom starter untuk memasukkan dependensi library dan project konfigurasi otomatis.

Untuk demonstrasi, kami telah membuat pustaka ucapan sederhana yang akan menerima pesan ucapan untuk waktu yang berbeda dalam sehari sebagai parameter konfigurasi dan menampilkan pesan ucapan. Kami juga akan membuat contoh aplikasi Spring Boot untuk mendemonstrasikan penggunaan konfigurasi otomatis dan modul starter kami.

3.1. Modul Konfigurasi Otomatis

Kami akan memanggil modul konfigurasi otomatis kami penyapa-spring-boot-autoconfigure . Modul ini akan memiliki dua kelas utama yaitu GreeterProperties yang akan memungkinkan sifat pengaturan kustom melalui application.properties berkas dan GreeterAutoConfiguartion yang akan membuat kacang untuk penyambut perpustakaan.

Mari kita lihat kode untuk kedua kelas:

@ConfigurationProperties(prefix = "baeldung.greeter") public class GreeterProperties { private String userName; private String morningMessage; private String afternoonMessage; private String eveningMessage; private String nightMessage; // standard getters and setters }
@Configuration @ConditionalOnClass(Greeter.class) @EnableConfigurationProperties(GreeterProperties.class) public class GreeterAutoConfiguration { @Autowired private GreeterProperties greeterProperties; @Bean @ConditionalOnMissingBean public GreetingConfig greeterConfig() { String userName = greeterProperties.getUserName() == null ? System.getProperty("user.name") : greeterProperties.getUserName(); // .. GreetingConfig greetingConfig = new GreetingConfig(); greetingConfig.put(USER_NAME, userName); // ... return greetingConfig; } @Bean @ConditionalOnMissingBean public Greeter greeter(GreetingConfig greetingConfig) { return new Greeter(greetingConfig); } }

Kita juga perlu menambahkan file spring.factories di direktori src / main / resources / META-INF dengan konten berikut:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.baeldung.greeter.autoconfigure.GreeterAutoConfiguration

Pada startup aplikasi, kelas GreeterAutoConfiguration akan dijalankan jika kelas Greeter ada di jalur kelas. Jika berjalan dengan sukses, itu akan mengisi konteks aplikasi Spring dengan GreeterConfig dan kacang Greeter dengan membaca properti melalui kelas GreeterProperties .

The @ConditionalOnMissingBean penjelasan akan memastikan bahwa kacang ini hanya akan dibuat jika mereka tidak sudah ada. Hal ini memungkinkan pengembang untuk sepenuhnya mengganti kacang yang dikonfigurasi otomatis dengan menentukan milik mereka sendiri di salah satu kelas @Configuration .

3.2. Membuat pom.xml

Sekarang mari kita buat starter pom yang akan membawa dependensi untuk modul konfigurasi otomatis dan library penyapa.

Sesuai dengan konvensi penamaan, semua permulaan yang tidak dikelola oleh tim inti Spring Boot harus dimulai dengan nama perpustakaan diikuti dengan sufiks -spring-boot-starter . Jadi kami akan memanggil starter kami sebagai penyapa-musim semi-boot-starter:

 4.0.0 com.baeldung greeter-spring-boot-starter 0.0.1-SNAPSHOT  UTF-8 0.0.1-SNAPSHOT 2.2.6.RELEASE    org.springframework.boot spring-boot-starter ${spring-boot.version}   com.baeldung greeter-spring-boot-autoconfigure ${project.version}   com.baeldung greeter ${greeter.version}   

3.3. Menggunakan Starter

Mari buat greeter-spring-boot-sample-app yang akan menggunakan starter. Di pom.xml kita perlu menambahkannya sebagai dependensi:

 com.baeldung greeter-spring-boot-starter ${greeter-starter.version} 

Spring Boot akan secara otomatis mengkonfigurasi semuanya dan kita akan memiliki kacang Greeter yang siap untuk diinjeksi dan digunakan.

Mari kita juga mengubah beberapa nilai default dari GreeterProperties dengan mendefinisikannya di file application.properties dengan awalan baeldung.greeter :

baeldung.greeter.userName=Baeldung baeldung.greeter.afternoonMessage=Woha\ Afternoon

Terakhir, mari gunakan kacang Greeter dalam aplikasi kita:

@SpringBootApplication public class GreeterSampleApplication implements CommandLineRunner { @Autowired private Greeter greeter; public static void main(String[] args) { SpringApplication.run(GreeterSampleApplication.class, args); } @Override public void run(String... args) throws Exception { String message = greeter.greet(); System.out.println(message); } }

4. Kesimpulan

Dalam tutorial singkat ini, kami berfokus pada peluncuran starter Spring Boot kustom, dan tentang bagaimana starter ini, bersama dengan mekanisme konfigurasi otomatis - bekerja di latar belakang untuk menghilangkan banyak konfigurasi manual.

Kode sumber lengkap untuk semua modul yang kami buat di artikel ini dapat ditemukan di GitHub.