Phân biệt Spring và SpringBoot
1. Tổng quan
Trong phần này chúng ta sẽ cùng tìm hiểu sự khác biệt giữa Spring frameswork và SpringBoot.
Chúng ta sẽ tập trung vào cách các module của Spring như MVC và Security khác nhau như thế nào khi được sử dụng trong Spring so với khi được sử dụng trong Spring Boot.
2. Spring là gì?
Spring famework cung cấp hỗ trợ nền tảng toàn diện để phát triển các ứng dụng Java.
Nó được đóng gói với một số tính năng tuyệt vời như Dependency Injection và các gói module ngoài như: Spring JDBC, Spring MVC, Spring Security, Spring AOP, Spring ORM, Spring Test.
Các module này có thể giúp chúng ta giảm đáng kể thời gian phát triển một ứng dụng.
Ví dụ như trong những ngày đầu tiên để phát triển ứng dụng Java web, chúng ta cần viết rất nhiều đoạn code để chèn một bản ghi vào trong cơ sở dữ liệu. Nhưng bằng cách sử dụng đến JDBCTemplate của Spring JDBC chúng ta có thể giảm nó xuống chỉ còn có một cài dòng code là đã có thể thêm một bản ghi vào trong cơ sở dữ liệu của mình.
3. SpringBoot là gì?
SpringBoot về cơ bản là một phần mở rộng của Spring framework đã loại bỏ các cấu hình được viết sẵn cần thiết để cài đặt một ứng dụng Spring.
Một vài tính năng của SpringBoot:
- Máy chủ nhúng để tránh phức tạp trong triển khai ứng dụng.
- Cấu hình tự động cho các chức năng của Spring – bất cứ khi nào có thể.
Hãy làm quen với cả 2 framework này từng bước một.
Bạn có thể tìm hiểu về SpringBoot chi tiết hơn ở bài viết sau: Spring Boot là gì?
4. Maven Dependencies
Trước hết, hãy xem xét các phụ thuộc (dependency) tối thiểu cần có để tạo ra một ứng dụng web bằng Spring:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.0.RELEASE</version> </dependency>
Không giống như Spring, SpringBoot chỉ yêu cầu một phụ thuộc duy nhất để khởi động và chạy ứng dụng web:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.0.5.RELEASE</version> </dependency>
Tất cả các phụ thuộc khác sẽ được tự động thêm vào kho lưu trữ cuối cùng trong lúc build.
Và một ví dụ điển hình khác là các thư viện testing. Chúng ta thường sử dụng bộ thư viện như Spring Test, JUnit, Hamcrest, Mockito. Trong một dự án Spring, chúng ta nên thêm tất cả các thư viện này làm các phụ thuộc.
Nhưng trong SpringBoot, chúng ta chỉ cần phụ thuộc starter cho việc tự động test vì nó đã bao gồm tất cả các thư viện này.
SpringBoot cung cấp một số phụ thuộc starter cho các module khác nhau. Dưới đây là một số cái được sử dụng phổ biến nhất:
- spring-boot-starter-data-jpa
- spring-boot-starter-security
- spring-boot-starter-test
- spring-boot-starter-web
- spring-boot-starter-thymeleaf
5. Cấu hình MVC
Hãy cùng khám phá cấu hình cần thiết để tạo ra một ứng dụng web JSP sử dụng cả Spring và SpringBoot.
Spring yêu cầu xác định dispatcher servlet, mappings và các cấu hình hỗ trợ khác. Chúng ta có thể thực hiện việc này bằng cách sử dụng tệp web.xml hoặc là một class Java để khởi tạo
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("/"); } }
Chúng ta cũng cần phải thêm các annotation @EnableWebMvc vào class chứa annotation @Configuration và xác định một view resolver để cấu hình views được trả về từ các controller:
@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; } }
So với tất cả những điều này, SpringBoot chỉ cần một vài thuộc tình để làm cho mọi thứ có thể hoạt động được bằng cách thêm đoạn code sau vào file application.properties:
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp
Tất cả các cấu hình Spring ở trên sẽ được tự động thêm vào thông qua một quá trình được gọi là cấu hình tự động.
Điều này có nghĩa là SpringBoot sẽ xem xét các phụ thuộc, các thuộc tính và các bean tồn tại trong ứng dụng và kích hoạt cấu hình dựa trên những điều này.
5.1 Configuring Template Engine
Bây giờ chúng ta hãy cùng tìm hiểu cách cấu hình công cụ Thymleaf trong cả Spring và SpringBoot
Trong Spring chúng ta cần phải thêm phụ thuộc thymeleaf-spring5 và một vài cấu hình cho view resolver:
@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); } }
SpringBoot 1 chỉ yêu cầu duy nhất phụ thuộc spring-boot-starter-thymeleaf để kích hoạt Thymleaf trong ứng dụng web. Nhưng do các tính năng mới trong thymleaf 3.0 chúng ta cần phải thêm phụ thuộc thymeleaf-layout-dialect vào trong ứng dụng web SpringBoot 2.
Khi các phụ thuộc đã có sẵn, chúng ta có thể thêm các template vào thư mục theo đường dẫn sau src/main/resources/templates và SpringBoot sẽ tự động hiển thị chúng.
6. Spring Security Configuration
Để đơn giản hơn, chúng ta sẽ xem cách xác thực HTTP cơ bản mặc định được kích hoạt bằng cách sử dụng các framwork này.
Hãy bắt đầu bằng cách xem xét các phụ thuộc và cấu hình chúng ta cần để kích hoạt Security bằng Spring.
Spring yêu cầu cả phụ thuộc spring-security-web và spring-security-config để thiết lập Security trong ứng dụng.
Tiếp theo, chúng ta cần thêm một lớp kế thừa WebSecurityConfigurerAdapter và sử dụng annotation @EnableWebSecurity:
@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(); } }
Ở đây chúng tôi đang sử dụng inMemoryAuthentication để thiết lập xác thực.
Tương tự, Spring Boot cũng yêu cầu các phụ thuộc này để làm cho nó hoạt động. Nhưng chúng ta chỉ cần duy nhất phụ thuộc spring-boot-starter-security vì điều này sẽ tự động thêm tất cả các phụ thuộc có liên quan vào classpath.
Cấu hình Security trong Spring Boot cũng giống như cấu hình ở trên.
7. Đóng gói và triển khai
Cuối cùng, hãy xem cách một ứng dụng có thể được đóng gói và triển khai. Cả hai framework này đều hỗ trợ các công nghệ quản lý các package phổ biến như Maven và Gradle. Nhưng khi triển khai, các framwork này khác nhau rất nhiều.
Một số ưu điểm của Spring Boot so với Spring trong deploy bao gồm:
- Cung cấp hỗ trợ vùng chứa được nhúng.
- Tùy chọn để chỉ định cấu hình hoạt động khi triển khai.
- Tạo cổng ngẫu nhiên cho integration tests.
8. Kết luận
Trong hướng dẫn này, chúng ta đã tìm hiểu về sự khác biệt giữa Spring và Spring Boot.
Nói một cách ngắn gọn, chúng ta có thể nói rằng Spring Boot chỉ đơn giản là một phần mở rộng của chính Spring để làm cho việc phát triển, kiểm thử và deploy thuận tiện hơn.
Leave a Reply