Perbandingan Antara Spring dan Spring Boot

1. Ikhtisar

Dalam artikel ini, kita akan melihat perbedaan antara framework Spring standar dan Spring Boot.

Kami akan fokus dan mendiskusikan bagaimana modul Spring, seperti MVC dan Keamanan, berbeda saat digunakan di inti Spring versus saat digunakan dengan Boot.

2. Apakah Musim Semi Itu?

Sederhananya, framework Spring menyediakan dukungan infrastruktur yang komprehensif untuk mengembangkan aplikasi Java .

Itu dikemas dengan beberapa fitur bagus seperti Dependency Injection dan modul out of the box seperti:

  • Musim semi JDBC
  • MVC musim semi
  • Keamanan Musim Semi
  • Musim semi AOP
  • Musim semi ORM
  • Uji Musim Semi

Modul-modul ini dapat secara drastis mengurangi waktu pengembangan aplikasi.

Misalnya, di hari-hari awal pengembangan web Java, kami perlu menulis banyak kode boilerplate untuk memasukkan record ke dalam sumber data. Tetapi dengan menggunakan template JDBCT dari modul Spring JDBC kita dapat menguranginya menjadi beberapa baris kode hanya dengan beberapa konfigurasi.

3. Apa itu Spring Boot?

Spring Boot pada dasarnya merupakan perpanjangan dari framework Spring yang menghilangkan konfigurasi boilerplate yang diperlukan untuk menyiapkan aplikasi Spring.

Dibutuhkan pandangan beropini dari platform Spring yang membuka jalan bagi ekosistem pengembangan yang lebih cepat dan lebih efisien .

Berikut ini beberapa fitur di Spring Boot:

  • Dependensi 'starter' untuk menyederhanakan konfigurasi build dan aplikasi
  • Server tertanam untuk menghindari kerumitan dalam penerapan aplikasi
  • Metrik, Health check, dan konfigurasi eksternal
  • Konfigurasi otomatis untuk fungsionalitas Spring - jika memungkinkan

Mari kenali kedua kerangka kerja ini selangkah demi selangkah.

4. Ketergantungan Maven

Pertama-tama, mari kita lihat dependensi minimum yang diperlukan untuk membuat aplikasi web menggunakan Spring:

 org.springframework spring-web 5.2.9.RELEASE   org.springframework spring-webmvc 5.2.9.RELEASE 

Tidak seperti Spring, Spring Boot hanya membutuhkan satu ketergantungan untuk mengaktifkan dan menjalankan aplikasi web:

 org.springframework.boot spring-boot-starter-web 2.3.4.RELEASE 

Semua dependensi lainnya ditambahkan secara otomatis ke arsip akhir selama waktu pembuatan.

Contoh bagus lainnya adalah menguji pustaka. Kami biasanya menggunakan kumpulan pustaka Uji Musim Semi, JUnit, Hamcrest, dan Mockito. Dalam proyek Spring, kita harus menambahkan semua pustaka ini sebagai dependensi.

Namun di Spring Boot, kami hanya memerlukan dependensi starter untuk pengujian agar otomatis menyertakan library ini.

Spring Boot menyediakan sejumlah dependensi starter untuk modul Spring yang berbeda. Beberapa yang paling umum digunakan adalah:

  • pegas-boot-starter-data-jpa
  • pegas-boot-starter-keamanan
  • pegas-boot-starter-test
  • pegas-boot-starter-web
  • pegas-boot-starter-timeleaf

Untuk daftar lengkap permulaan, lihat juga dokumentasi Musim Semi.

5. Konfigurasi MVC

Mari jelajahi konfigurasi yang diperlukan untuk membuat aplikasi web JSP menggunakan Spring dan Spring Boot.

Spring membutuhkan penentuan servlet dispatcher, pemetaan, dan konfigurasi pendukung lainnya. Kita dapat melakukan ini menggunakan file web.xml atau kelas Penginisialisasi :

public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.setConfigLocation("com.baeldung"); container.addListener(new ContextLoaderListener(context)); ServletRegistration.Dynamic dispatcher = container .addServlet("dispatcher", new DispatcherServlet(context)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); } }

Kita juga perlu menambahkan anotasi @EnableWebMvc ke kelas @Configuration dan menentukan resolver tampilan untuk menyelesaikan tampilan yang dikembalikan dari pengontrol:

@EnableWebMvc @Configuration public class ClientWebConfig implements WebMvcConfigurer { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver bean = new InternalResourceViewResolver(); bean.setViewClass(JstlView.class); bean.setPrefix("/WEB-INF/view/"); bean.setSuffix(".jsp"); return bean; } }

Dibandingkan dengan semua ini, Spring Boot hanya membutuhkan beberapa properti untuk membuatnya berfungsi, setelah kami menambahkan web starter:

spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp

Semua konfigurasi Spring di atas secara otomatis disertakan dengan menambahkan web starter Boot, melalui proses yang disebut konfigurasi otomatis.

Artinya, Spring Boot akan melihat dependensi, properti, dan kacang yang ada dalam aplikasi dan mengaktifkan konfigurasi berdasarkan ini.

Tentu saja, jika kita ingin menambahkan konfigurasi kustom kita sendiri, maka konfigurasi otomatis Spring Boot akan mundur.

5.1. Mengonfigurasi Mesin Template

Sekarang mari kita pelajari cara mengkonfigurasi mesin template Thymeleaf di Spring dan Spring Boot.

Di Spring kita perlu menambahkan dependensi thymeleaf-spring5 dan beberapa konfigurasi untuk resolver tampilan:

@Configuration @EnableWebMvc public class MvcWebConfig implements WebMvcConfigurer { @Autowired private ApplicationContext applicationContext; @Bean public SpringResourceTemplateResolver templateResolver() { SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setApplicationContext(applicationContext); templateResolver.setPrefix("/WEB-INF/views/"); templateResolver.setSuffix(".html"); return templateResolver; } @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver()); templateEngine.setEnableSpringELCompiler(true); return templateEngine; } @Override public void configureViewResolvers(ViewResolverRegistry registry) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine()); registry.viewResolver(resolver); } }

Spring Boot 1 hanya memerlukan ketergantungan spring-boot-starter-thymeleaf untuk mengaktifkan dukungan Thymeleaf dalam aplikasi web. Tetapi karena fitur-fitur baru di Thymeleaf3.0, kami harus menambahkan dialek-layout-thymeleaf juga sebagai dependensi dalam aplikasi web Spring Boot 2. Alternatifnya, kita dapat memilih untuk menambahkan dependensi spring-boot-starter-thymeleaf yang akan menangani semua ini untuk kita.

Once the dependencies are in place, we can add the templates to the src/main/resources/templates folder and the Spring Boot will display them automatically.

6. Spring Security Configuration

For the sake of simplicity, we'll see how the default HTTP Basic authentication is enabled using these frameworks.

Let's start by looking at the dependencies and configuration we need to enable Security using Spring.

Spring requires both the standard spring-security-web and spring-security-config dependencies to set up Security in an application.

Next, we need to add a class that extends the WebSecurityConfigurerAdapter and makes use of the @EnableWebSecurity annotation:

@Configuration @EnableWebSecurity public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user1") .password(passwordEncoder() .encode("user1Pass")) .authorities("ROLE_USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .httpBasic(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }

Here we're using inMemoryAuthentication to set up the authentication.

Similarly, Spring Boot also requires these dependencies to make it work. But we need to define only the dependency ofspring-boot-starter-security as this will automatically add all the relevant dependencies to the classpath.

The security configuration in Spring Boot is the same as the one above.

If you need to know how the JPA configuration can be achieved in both Spring and Spring Boot, then check out our article A Guide to JPA with Spring.

7. Application Bootstrap

The basic difference in bootstrapping of an application in Spring and Spring Boot lies with the servlet. Spring uses either the web.xml or SpringServletContainerInitializer as its bootstrap entry point.

On the other hand, Spring Boot uses only Servlet 3 features to bootstrap an application. Let's talk about this in detail.

7.1. How Spring Bootstraps?

Spring supports both the legacy web.xml way of bootstrapping as well as the latest Servlet 3+ method.

Let's see the web.xml approach in steps:

  1. Servlet container (the server) reads web.xml
  2. The DispatcherServlet defined in the web.xml is instantiated by the container
  3. DispatcherServlet creates WebApplicationContext by reading WEB-INF/{servletName}-servlet.xml
  4. Finally, the DispatcherServlet registers the beans defined in the application context

Here's how Spring bootstraps using Servlet 3+ approach:

  1. The container searches for classes implementing ServletContainerInitializer and executes
  2. The SpringServletContainerInitializer finds all classes implementing WebApplicationInitializer
  3. The WebApplicationInitializer creates the context with XML or @Configuration classes
  4. The WebApplicationInitializer creates the DispatcherServlet with the previously created context.

7.2. How Spring Boot Bootstraps?

The entry point of a Spring Boot application is the class which is annotated with @SpringBootApplication:

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

By default, Spring Boot uses an embedded container to run the application. In this case, Spring Boot uses the public static void main entry-point to launch an embedded web server.

Also, it takes care of the binding of the Servlet, Filter, and ServletContextInitializer beans from the application context to the embedded servlet container.

Another feature of Spring Boot is that it automatically scans all the classes in the same package or sub packages of the Main-class for components.

Spring Boot provides the option of deploying it as a web archive in an external container as well. In this case, we have to extend the SpringBootServletInitializer:

@SpringBootApplication public class Application extends SpringBootServletInitializer { // ... }

Here the external servlet container looks for the Main-class defined in the META-INF file of the web archive and the SpringBootServletInitializer will take care of binding the Servlet, Filter, and ServletContextInitializer.

8. Packaging and Deployment

Finally, let's see how an application can be packaged and deployed. Both of these frameworks support the common package managing technologies like Maven and Gradle. But when it comes to deployment, these frameworks differ a lot.

For instance, the Spring Boot Maven Plugin provides Spring Boot support in Maven. It also allows packaging executable jar or war archives and running an application “in-place”.

Some of the advantages of Spring Boot over Spring in the context of deployment include:

  • Provides embedded container support
  • Provision to run the jars independently using the command java -jar
  • Option to exclude dependencies to avoid potential jar conflicts when deploying in an external container
  • Option to specify active profiles when deploying
  • Random port generation for integration tests

9. Conclusion

Dalam tutorial ini, kita telah mempelajari perbedaan antara Spring dan Spring Boot.

Singkatnya, kita dapat mengatakan bahwa Spring Boot hanyalah perpanjangan dari Spring itu sendiri untuk membuat pengembangan, pengujian, dan penerapan lebih nyaman.