Spring Boot vs Spring MVC vs Spring - Bagaimana mereka membandingkan?

Spring, Spring Boot, Spring MVC, di mana-mana ada kata "spring"! Mari kita berjalan di mana dan kapan Anda dapat menggunakan masing-masing alat ini.
Pada artikel ini, Anda akan melihat ulasan: Spring, Spring MVC, dan Spring Boot, mencari tahu masalah apa yang mereka pecahkan, dan di mana mereka terbaik diterapkan. Fakta terpenting yang Anda pelajari adalah Spring, Spring MVC, dan Spring Boot tidak bersaing untuk mendapatkan tempat yang sama. Mereka memecahkan masalah yang berbeda, dan mereka menyelesaikannya dengan sangat baik.
Apa masalah utama yang dipecahkan oleh Kerangka Kerja Musim Semi ini?
Berpikir panjang dan keras. Apa masalah yang dipecahkan oleh Spring Framework?
Mengapa ini penting? Karena ketika DI atau IOC digunakan dengan benar, kita dapat mengembangkan aplikasi yang digabungkan secara longgar. Dan aplikasi yang digabungkan secara longgar dapat dengan mudah diuji dengan unit test.
Mari kita lihat contoh sederhana.
Contoh tanpa injeksi ketergantungan
Pertimbangkan contoh di bawah ini: WelcomeController bergantung pada WelcomeService untuk menerima pesan selamat datang. Apa yang dia lakukan untuk mendapatkan instance dari WelcomeService?
WelcomeService service = new WelcomeService();
Baris ini membuat turunan dari layanan ini. Dan ini berarti mereka sangat terhubung. Misalnya, jika saya membuat tiruan untuk WelcomeService dalam tes unit untuk WelcomeController, bagaimana cara saya mendapatkan WelcomeController untuk menggunakan tiruan? Tidak mudah!
@RestController public class WelcomeController { private WelcomeService service = new WelcomeService(); @RequestMapping("/welcome") public String welcome() { return service.retrieveWelcomeMessage(); } }
Contoh Injeksi Ketergantungan Sederhana
Dunia terlihat jauh lebih mudah dengan injeksi ketergantungan. Anda membiarkan Spring Framework melakukan kerja keras. Kami hanya menggunakan dua anotasi sederhana:
Komponen dan
Autowired .
- Menggunakan Component , kita katakan Spring Framework: Hei, ini adalah bin yang perlu Anda kelola.
- Menggunakan Autowired , kami katakan Spring Framework: Hei, temukan kecocokan yang tepat untuk jenis khusus ini dan pasang.
Dalam contoh di bawah ini, kerangka kerja Spring akan membuat kacang untuk WelcomeService dan menghubungkannya ke WelcomeController.
Dalam pengujian unit, saya dapat meminta kerangka Spring untuk menghubungkan mock WelcomeService ke WelcomeController. (Spring Boot membuat segalanya lebih mudah dengan melakukan ini dengan anotasi @MockBean. Tapi itu cerita lain!)
@Component public class WelcomeService {
Apa lagi yang dipecahkan oleh Kerangka Kerja Spring?
Masalah 1: Duplikasi Kode / Polusi
Apakah Spring Framework berhenti dengan injeksi ketergantungan? Tidak. Itu dibangun di atas konsep dasar injeksi ketergantungan dengan beberapa modul Pegas.
- Spring jdbc
- Musim semi mvc
- Spring aop
- Orm musim semi
- Spring jms
- Tes pegas
Mari kita renungkan Spring JMS dan Spring JDBC sejenak.
Apakah modul-modul ini membawa fungsionalitas baru? Tidak. Kita dapat melakukan semua ini pada J2EE atau Java EE. Jadi apa yang mereka bawa? Mereka membawa abstraksi sederhana. Tujuan dari abstraksi ini adalah:
- Kurangi Kode Boilerplate / Kurangi Duplikasi
- Promosikan Disconnect / Extend Testability
Misalnya, Anda memerlukan kode jauh lebih sedikit untuk menggunakan JDBCTemplate atau JMSTemplate dibandingkan dengan JDBC atau JMS tradisional.
Masalah 2: integrasi yang baik dengan kerangka kerja lain
Hal yang hebat tentang Spring Framework adalah tidak mencoba untuk menyelesaikan masalah yang sudah diselesaikan. Yang dia lakukan adalah memberikan integrasi yang sangat baik dengan kerangka kerja lain, yang pada gilirannya memberikan solusi yang sangat baik.
- Hibernasi untuk ORM
- iBatis untuk Pemetaan Objek
- JUnit dan Mockito untuk pengujian unit
Mengapa kita membutuhkan spring boot?
Aplikasi berbasis pegas memiliki banyak konfigurasi.
Ketika kita menggunakan Spring MVC, kita perlu mengkonfigurasi: pemindaian komponen, servlet pengirim, penyelesai tampilan, guci web (untuk mengirimkan konten statis) di antara hal-hal lain.
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean><mvc:resources mapping="/webjars/**" location="/webjars/"/>
Kode di bawah ini menunjukkan konfigurasi servlet operator khusus dalam aplikasi web.
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/todo-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet><servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
Ketika kita menggunakan Hibernate / JPA, kita perlu mengkonfigurasi sumber data, pabrik entitas manajer, manajer transaksi, dan hal-hal lain.
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${db.driver}" /> <property name="jdbcUrl" value="${db.url}" /> <property name="user" value="${db.username}" /> <property name="password" value="${db.password}" /> </bean><jdbc:initialize-database data-source="dataSource"> <jdbc:script location="classpath:config/schema.sql" /> <jdbc:script location="classpath:config/data.sql" /> </jdbc:initialize-database><bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="persistenceUnitName" value="hsql_pu" /> <property name="dataSource" ref="dataSource" /> </bean><bean id="transactionManager"class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> <property name="dataSource" ref="dataSource" /> </bean><tx:annotation-driven transaction-manager="transactionManager"/>
Masalah 1: Konfigurasi Booting Otomatis Musim Semi: Bisakah Kita Berpikir Berbeda?
Spring Boot membawa proses pemikiran baru di sekitar itu semua.
- Bagaimana dengan konfigurasi otomatis sumber data jika tabung Hibernate ada di classpath?
- Bagaimana dengan konfigurasi otomatis Dispatcher Servlet jika Spring MVC jar berada di classpath?
Kemudian akan ada ketentuan untuk mengganti konfigurasi otomatis default.
Masalah 2: Proyek Pemula Boot Musim Semi: Dibangun dengan Pola yang Terkenal
Katakanlah kita ingin mengembangkan aplikasi web.
Pertama-tama, kita perlu menentukan kerangka kerja yang ingin kita gunakan, versi mana yang digunakan, dan bagaimana menghubungkannya bersama.
Semua aplikasi web memiliki kebutuhan yang serupa. Ketergantungan berikut digunakan di Spring MVC. Ini termasuk Spring MVC, Jackson Databind, Hibernate-Validator, dan Log4j.
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.2.RELEASE</version> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> </dependency><dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.0.2.Final</version> </dependency><dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
Jika Anda ingin mengembangkan aplikasi web atau aplikasi untuk layanan RESTful, pilihan Anda adalah Spring Boot Start Web. Mari kita cepat membuat proyek dengan Spring Boot Starter Web menggunakan Spring Initializr.
Ketergantungan untuk Spring Boot Starter Web
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
Tangkapan layar berikut menunjukkan berbagai dependensi yang telah ditambahkan ke aplikasi kami.

Ketergantungan dapat diklasifikasikan ke dalam:
- Musim semi: inti, kacang, konteks, aop
- MVC Web: (MVC Musim Semi)
- Jackson: untuk komunikasi JSON
- Validasi: Hibernate Validator, Validation API
- Wadah Servlet Tertanam: Tomcat
- Logging: logback, slf4j
Setiap aplikasi web biasa akan menggunakan semua dependensi ini. Spring Boot Starter Web hadir bersama mereka. Sebagai pengembang, saya tidak perlu khawatir tentang ketergantungan ini atau versi yang kompatibel.
Opsi Proyek Pemula Boot Musim Semi
Seperti yang dapat kita lihat dari Spring Boot Starter Web, proyek-proyek startup membantu kita dengan cepat memulai mengembangkan jenis aplikasi tertentu.
- spring-boot-starter-web-services: SOAP Web Services
- spring-boot-starter-web: Web dan aplikasi tenang
- spring-boot-starter-test: pengujian unit dan pengujian integrasi
- spring-boot-starter-jdbc: JDBC Tradisional
- spring-boot-starter-hateoas: Tambahkan fitur HATEOAS ke layanan Anda
- spring-boot-starter-security: Otentikasi dan Otorisasi menggunakan Spring Security
- spring-boot-starter-data-jpa: Spring Data JPA dengan Hibernate
- spring-boot-starter-cache: Mengaktifkan dukungan caching Spring Framework
- spring-boot-starter-data-rest: Menyediakan layanan REST sederhana menggunakan Spring Data REST
Tujuan lain dari Spring Boot
Ada juga beberapa permulaan untuk hal-hal teknis:
- spring-boot-starter-actuator: Untuk menggunakan fitur-fitur canggih seperti memantau dan melacak aplikasi Anda di luar kotak
- spring-boot-starter-undertow, spring-boot-starter-jetty, spring-boot-starter-tomcat: Untuk memilih wadah servlet bawaan tertentu
- spring-boot-starter-logging: Untuk logging menggunakan logback
- spring-boot-starter-log4j2: Logging menggunakan Log4j2
Spring Boot bertujuan untuk membuat aplikasi untuk periode yang lebih singkat.
- Aktuator: Mengaktifkan pemantauan dan pelacakan aplikasi lanjutan.
- Embedded Server Integations: Karena server terintegrasi ke dalam aplikasi, saya harus memiliki server aplikasi terpisah yang diinstal pada server
- Penanganan Kesalahan Default