post-image

Phân biệt Spring và SpringBoot

Tổng quan

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-webspring-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.

Nguồn: https://www.baeldung.com/spring-vs-spring-boot

Leave a Reply

Your email address will not be published.