Apa yang Baru di Spring Boot 2?

1. Ikhtisar

Spring Boot membawa pendekatan beropini ke ekosistem Spring. Pertama kali dirilis pada pertengahan 2014. Spring Boot telah melalui banyak pengembangan dan peningkatan. Versi 2.0-nya hari ini bersiap-siap untuk dirilis pada awal 2018.

Ada beberapa area berbeda di mana perpustakaan populer ini mencoba membantu kami:

  • Manajemen ketergantungan. Melalui pemula dan berbagai integrasi pengelola paket
  • Konfigurasi otomatis. Mencoba meminimalkan jumlah konfigurasi yang diperlukan aplikasi Spring untuk bersiap-siap dan lebih menyukai konvensi daripada konfigurasi
  • Fitur siap produksi. Seperti Aktuator , logging yang lebih baik, pemantauan, metrik atau berbagai integrasi PAAS
  • Pengalaman pengembangan yang ditingkatkan. Dengan beberapa utilitas pengujian atau umpan balik yang lebih baik menggunakan spring-boot-devtools

Dalam artikel ini, kita akan membahas beberapa perubahan dan fitur yang direncanakan untuk Spring Boot 2.0. Kami juga akan menjelaskan bagaimana perubahan ini dapat membantu kami menjadi lebih produktif.

2. Dependensi

2.1. Dasar Jawa

Spring Boot 2.x tidak lagi mendukung Java 7 dan di bawahnya , karena Java 8 merupakan persyaratan minimum.

Ini juga versi pertama yang mendukung Java 9. Tidak ada rencana untuk mendukung Java 9 di cabang 1.x. Ini berarti jika Anda ingin menggunakan rilis Java terbaru dan memanfaatkan kerangka kerja ini, Spring Boot 2.x adalah satu-satunya pilihan Anda .

2.2. Bill of material

Dengan setiap rilis baru Spring Boot, versi berbagai dependensi ekosistem Java ditingkatkan. Ini didefinisikan dalam Boot bill of material alias BOM .

Dalam 2.x ini tidak terkecuali. Tidak masuk akal untuk mencantumkannya, tetapi kita dapat melihat spring-boot-dependencies.pom untuk melihat versi apa yang digunakan pada waktu tertentu.

Beberapa sorotan mengenai versi minimum yang dibutuhkan:

  • Versi minimum yang didukung Tomcat adalah 8.5
  • Versi Hibernate minimum yang didukung adalah 5.2
  • Versi minimum yang didukung Gradle adalah 3.4

2.3. Plugin Gradle

Plugin Gradle telah mengalami peningkatan besar dan beberapa perubahan yang dapat menyebabkan gangguan.

Untuk membuat fat jars, tugas bootRepackage Gradle diganti dengan bootJar dan bootWar untuk membuat jar dan perang.

Jika kami ingin menjalankan aplikasi kami dengan plugin Gradle, di 1.x, kami dapat menjalankan bootRun gradle. Dalam 2.x bootRun memperluas JavaExec Gradle. Ini menyiratkan lebih mudah bagi kita untuk mengkonfigurasinya dengan menerapkan konfigurasi yang sama yang biasanya kita gunakan dalam tugas JavaExec klasik .

Terkadang kami mendapati diri kami ingin memanfaatkan Spring Boot BOM. Namun terkadang kami tidak ingin membuat aplikasi Boot lengkap atau mengemasnya kembali.

Dalam hal ini, menarik untuk diketahui bahwa Spring Boot 2.x tidak lagi menerapkan plugin manajemen ketergantungan secara default .

Jika kita menginginkan manajemen ketergantungan Spring Boot, kita harus menambahkan:

apply plugin: 'io.spring.dependency-management'

Ini memberi kami fleksibilitas yang lebih besar dengan konfigurasi yang lebih sedikit dalam skenario yang disebutkan di atas.

3. Konfigurasi otomatis

3.1. Keamanan

Dalam 2.x konfigurasi keamanan disederhanakan secara dramatis. Secara default, semuanya diamankan, termasuk sumber daya statis dan titik akhir Aktuator.

Setelah pengguna mengonfigurasi keamanan secara eksplisit, default Spring Boot akan berhenti berpengaruh. Pengguna kemudian dapat mengonfigurasi semua aturan akses di satu tempat.

Ini akan mencegah kami berjuang dengan masalah pemesanan WebSecurityConfigurerAdapter . Masalah ini biasanya terjadi saat mengonfigurasi Aktuator dan aturan keamanan Aplikasi dengan cara khusus.

Mari kita lihat cuplikan keamanan sederhana yang menggabungkan aturan aktuator dan aplikasi:

http.authorizeRequests() .requestMatchers(EndpointRequest.to("health")) .permitAll() // Actuator rules per endpoint .requestMatchers(EndpointRequest.toAnyEndpoint()) .hasRole("admin") // Actuator general rules .requestMatchers(PathRequest.toStaticResources().atCommonLocations()) .permitAll() // Static resource security .antMatchers("/**") .hasRole("user") // Application security rules // ...

3.2. Dukungan Reaktif

Spring Boot 2 menghadirkan satu set permulaan baru untuk modul reaktif yang berbeda. Beberapa contohnya adalah WebFlux, dan mitra reaktif untuk MongoDB, Cassandra atau Redis.

Ada juga utilitas uji untuk WebFlux. Secara khusus, kami dapat memanfaatkan @WebFluxTest. Ini berperilaku mirip dengan @WebMvcTest lama yang awalnya diperkenalkan sebagai bagian dari berbagai potongan pengujian pada 1.4.0.

4. Fitur Siap Produksi

Spring Boot menghadirkan beberapa alat yang berguna untuk memungkinkan kita membuat aplikasi siap produksi. Antara lain, kita dapat memanfaatkan Spring Boot Actuator.

Aktuator berisi berbagai alat untuk menyederhanakan pemantauan, penelusuran, dan introspeksi aplikasi umum. Rincian lebih lanjut tentang aktuator dapat ditemukan di artikel kami sebelumnya.

Dengan 2 versi aktuatornya telah melalui peningkatan besar. Iterasi ini fokus pada penyederhanaan kustomisasi. Ini juga mendukung teknologi web lainnya, termasuk modul reaktif baru.

4.1. Dukungan Teknologi

Di Spring Boot 1.x hanya Spring-MVC yang didukung untuk titik akhir aktuator. Dalam 2.x, bagaimanapun, itu menjadi independen dan dapat dicolokkan. Spring boot sekarang menghadirkan dukungan di luar kotak untuk WebFlux, Jersey, dan Spring-MVC.

As before, JMX remains an option and can be enabled or disabled through configuration.

4.2. Creating Custom Endpoints

The new actuator infrastructure is technology-agnostic. Because of this, the development model has been redesigned from scratch.

The new model also brings greater flexibility and expressiveness.

Let's see how to create a Fruits endpoint for actuator:

@Endpoint(id = "fruits") public class FruitsEndpoint { @ReadOperation public Map fruits() { ... } @WriteOperation public void addFruits(@Selector String name, Fruit fruit) { ... } }

Once we register FruitsEndpoint in our ApplicationContext, it can be exposed as a web endpoint using our chosen technology. We could also expose it via JMX depending on our configuration.

Translating our endpoint to web endpoints, this would result in:

  • GET on /application/fruits returning fruits
  • POST on /applications/fruits/{a-fruit} handling that fruit which should be included in the payload

There are many more possibilities. We could retrieve more granular data. Also, we could define specific implementations per underlying technology (e.g., JMX vs. Web). For the purpose of the article, we'll keep it as a simple introduction without getting into too much detail.

4.3. Security in Actuator

In Spring Boot 1.x Actuator defines its own security model. This security model is different from the one used by our application.

This was the root of many pain points when users were trying to refine security.

In 2.x the security configuration should be configured using the same config that the rest of the application uses.

By default, most actuator endpoints are disabled. This is independent of whether Spring Security is in the classpath or not. Beyond status and info, all the other endpoints need to be enabled by the user.

4.4. Other Important Changes

  • Most configuration properties are now under management.xxx e.g.: management.endpoints.jmx
  • Some endpoints have a new format. e.g.: env, flyway or liquibase
  • Predefined endpoint paths are no longer configurable

5. Enhanced Development Experience

5.1. Better Feedback

Spring boot introduced devtools in 1.3.

It takes care of smoothing out typical development issues. For example, caching of view technologies. It also performs automatic restarts and browser live-reloading. Also, it enables us to remote debug apps.

In 2.x when our application gets restarted by devtools a ‘delta' report will be printed out. This report will point out what changed and the impact it might have on our application.

Let's say we define a JDBC Datasource overriding the one configured by Spring Boot.

Devtools will indicate that the one autoconfigured is no longer created. It will also point out the cause, an adverse match in @ConditionalOnMissingBean for type javax.sql.DataSource. Devtools will print this report once it performs a restart.

5.2. Breaking Changes

Due to JDK 9 issues, devtools is dropping support for remote debugging through HTTP.

6. Summary

In this article, we covered some of the changes that Spring Boot 2 will bring.

We discussed dependencies and how Java 8 becomes the minimum supported version.

Next, we talked about autoconfiguration. We focused on security among others. We also talked about actuator and the many improvements it has received.

Lastly, we talked about some minor tweaks that happened in the development tools provided.