- vừa được xem lúc

Giải ngố về @SpringBootApplication cách mà một ứng dụng Spring Boot được khởi tạo như thế nào

0 0 1

Người đăng: Sang Le

Theo Viblo Asia

Làm thế nào Spring Boot khởi động ứng dụng của bạn?


Spring Boot là một trong những framework mạnh mẽ và phổ biến nhất cho việc xây dựng ứng dụng Java hiện đại. Nhưng bạn đã bao giờ tự hỏi điều gì thực sự xảy ra đằng sau dòng lệnh đơn giản SpringApplication.run(Main.class, args); chưa?

Uki chúng ta đi vào phân tích đoạn code sau để biết một ứng dụng Spring boot khởi tạo như thế nào nhe:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); }
}

Vai trò của annotation @SpringBootApplication và các thành phần của nó.

  • Cách mà SpringApplication.run() thực sự hoạt động.
  • Quá trình tự động cấu hình (Auto-Configuration) trong Spring Boot.
  • Cách ứng dụng quản lý các bean, cấu hình môi trường, và khởi chạy máy chủ web.

1. @SpringBootApplication Annotation

Thành phần của @SpringBootApplication:

@SpringBootApplication là một meta-annotation, bao gồm ba annotation chính:

  1. @SpringBootConfiguration:

    • Là một alias của @Configuration, chỉ định lớp này là lớp cấu hình (configuration class).
    • Cung cấp khả năng định nghĩa bean trong phương thức với @Bean.
  2. @EnableAutoConfiguration:

    • Kích hoạt tính năng Auto-Configuration của Spring Boot:
      • Spring Boot tự động cấu hình các bean dựa trên thư viện có trong classpath và cấu hình mặc định.
      • Ví dụ:
        • Nếu spring-boot-starter-web có trong classpath, Spring Boot tự động cấu hình Tomcat và DispatcherServlet.
        • Nếu có spring-boot-starter-data-jpa, Spring Boot cấu hình EntityManager, DataSource, và Hibernate.
  3. @ComponentScan:

    • Kích hoạt cơ chế component scanning:
      • Tìm kiếm các bean và component trong package hiện tại và các package con (sub-packages) dựa trên các annotation như @Component, @Service, @Repository, @Controller.

2. public static void main(String[] args)

Phương thức main là điểm bắt đầu (entry point) của ứng dụng Java, và cũng là nơi Spring Boot bắt đầu khởi chạy ứng dụng.


3. SpringApplication.run(Main.class, args)

SpringApplication.run() là nơi Spring Boot khởi chạy toàn bộ ứng dụng:

  1. Tạo đối tượng SpringApplication:

    • SpringApplication.run(Main.class, args) tạo một đối tượng SpringApplication dựa trên class được truyền vào (ở đây là Main.class).
    • Xác định loại ứng dụng (WebApplication hoặc CLI Application) dựa trên classpath:
      • Nếu có spring-web hoặc spring-webmvc, nó sẽ khởi tạo ứng dụng web.
      • Nếu không, khởi tạo ứng dụng kiểu non-web (CLI).
  2. Cấu hình môi trường (Environment):

    • Spring tự động load các thông tin từ application.properties, application.yml, hoặc biến môi trường hệ thống.
    • Xác định cấu hình active profiles (nếu có).
  3. Khởi tạo ApplicationContext:

    • Dựa trên loại ứng dụng, Spring Boot tạo ApplicationContext phù hợp:
      • WebApplicationContext: Nếu là ứng dụng web.
      • AnnotationConfigApplicationContext: Nếu không phải web.
    • ApplicationContext quản lý toàn bộ lifecycle của ứng dụng Spring:
      • Tạo, quản lý và khởi tạo các bean.
      • Xử lý dependency injection.
  4. Tự động cấu hình (Auto-Configuration):

    • Dựa trên @EnableAutoConfiguration, Spring Boot tìm kiếm và kích hoạt các cấu hình mặc định trong META-INF/spring.factories.
  5. Kích hoạt Component Scan:

    • Dựa trên @ComponentScan, tìm kiếm các lớp có annotation như @Component, @Service, @Repository, @Controller trong package hiện tại và sub-packages.
  6. Khởi chạy ApplicationContext:

    • ApplicationContext khởi tạo tất cả các bean, xử lý injection, và thực hiện các lifecycle callback như:
      • @PostConstruct trên bean.
      • Các listener đăng ký qua ApplicationListener.
  7. Kích hoạt các ApplicationRunnerCommandLineRunner:

    • Nếu có các bean implement ApplicationRunner hoặc CommandLineRunner, chúng được chạy sau khi ApplicationContext khởi tạo.
  8. Khởi chạy máy chủ Web (nếu là ứng dụng web):

    • Tự động khởi chạy một máy chủ nhúng hay còn gọi là embedded server (Tomcat, Jetty, hoặc Undertow) để xử lý HTTP request. Mặt định SpringBoot sẽ khởi tạo một Tomcat server, bạn cũng có thể custom lại embedded server này.
    • Tạo DispatcherServlet để định tuyến các request đến controller tương ứng.

Quá trình khởi động của Spring Boot

Tóm tắt các bước chính khi chạy SpringApplication.run():

  1. Khởi tạo SpringApplication:

    • Xác định loại ứng dụng (web hoặc non-web).
    • Chuẩn bị các cấu hình môi trường.
  2. Khởi tạo ApplicationContext:

    • Tạo ApplicationContext phù hợp.
    • Quét và khởi tạo các bean từ @ComponentScan.
  3. Tự động cấu hình:

    • Tải các cấu hình mặc định từ spring.factories.
  4. Khởi chạy ứng dụng:

    • Kích hoạt các bean lifecycle.
    • Bắt đầu máy chủ web (nếu cần).

Kết luận

Tadaa thì chúng ta đã đi qua cách mà một ứng dụng Spring boot được khởi tạo như thế nào, tuy nó đơn giản nhưng bên dưới, Spring Boot tự động thực hiện nhiều công việc nặng nhọc cho chúng ta như tự động cấu hình, khởi tạo bean, và quản lý lifecycle của ứng dụng.

Các bài tiếp tiếp theo chúng ta sẽ đi sâu chi tiết hơn về các thành phần trên nhé, nếu mn thấy bài viết dễ hiểu thì hãy vote giúp mình để mình có động lực viết thêm nhiều bài viết hay hơn, chất lượng hơn.

Cảm ơn mọi người và hẹn gặp lại mọi người trong các bài viết tiếp theo.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tổng hợp các bài hướng dẫn về Design Pattern - 23 mẫu cơ bản của GoF

Link bài viết gốc: https://gpcoder.com/4164-gioi-thieu-design-patterns/. Design Patterns là gì. Design Patterns không phải là ngôn ngữ cụ thể nào cả.

0 0 302

- vừa được xem lúc

Học Spring Boot bắt đầu từ đâu?

1. Giới thiệu Spring Boot. 1.1.

0 0 278

- vừa được xem lúc

Cần chuẩn bị gì để bắt đầu học Java

Cần chuẩn bị những gì để bắt đầu lập trình Java. 1.1. Cài JDK hay JRE.

0 0 50

- vừa được xem lúc

Sử dụng ModelMapper trong Spring Boot

Bài hôm nay sẽ là cách sử dụng thư viện ModelMapper để mapping qua lại giữa các object trong Spring nhé. Trang chủ của ModelMapper đây http://modelmapper.org/, đọc rất dễ hiểu dành cho các bạn muốn tìm hiểu sâu hơn. 1.

0 0 194

- vừa được xem lúc

[Java] 1 vài tip nhỏ khi sử dụng String hoặc Collection part 1

. Hello các bạn, hôm nay mình sẽ chia sẻ về mẹo check String null hay full space một cách tiện lợi. Mình sẽ sử dụng thư viện Lớp StringUtils download file jar để import vào thư viện tại (link).

0 0 71

- vừa được xem lúc

Deep Learning với Java - Tại sao không?

Muốn tìm hiểu về Machine Learning / Deep Learning nhưng với background là Java thì sẽ như thế nào và bắt đầu từ đâu? Để tìm được câu trả lời, hãy đọc bài viết này - có thể kỹ năng Java vốn có sẽ giúp bạn có những chuyến phiêu lưu thú vị. DJL là tên viết tắt của Deep Java Library - một thư viện mã ng

0 0 139