Khóa học spring-boot

Component Scan là gì

0 phút đọc

Trong lập trình Spring Boot, "Component Scan" là một khái niệm quan trọng để Spring Boot có thể tìm kiếm và quản lý các đối tượng (beans) trong ứng dụng của bạn một cách tự động. Trong bài viết này, chúng ta sẽ tìm hiểu về Component Scan và cách nó hoạt động.

Giới thiệu

Trong các ứng dụng Spring Boot, chúng ta thường định nghĩa các bean bằng cách sử dụng các Annotation như @Component, @Service, @Repository, hoặc @Controller. Các bean này cần được quản lý và tạo ra bởi Spring Boot để chúng ta có thể sử dụng chúng trong ứng dụng.

Tuy nhiên, việc đánh dấu các bean này không đủ để Spring Boot biết cần tạo và quản lý chúng như thế nào. Đây là lúc Component Scan ra đời.

Cài đặt

Trước khi đi sâu vào Component Scan, hãy xem qua cấu trúc Maven của một dự án Spring Boot thông qua ví dụ sau:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>me.kungfutech.spring</groupId>
    <artifactId>spring-boot-learning</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-learning</name>
    <description>Everything about Spring Boot</description>

    <!-- Các dependency -->

</project>

Component Scan là gì

Component Scan cho phép Spring Boot tự động tìm kiếm và quản lý các bean trong ứng dụng của bạn. Mặc định, Spring Boot sẽ quét toàn bộ các package và các package con của package chứa class chứa hàm main.

Dưới đây là ví dụ minh họa:

Giả sử chúng ta có cấu trúc thư mục ứng dụng như sau:

src
└── main
    └── java
        └── me
            └── kungfutech
                └── spring
                    ├── App.java
                    ├── Girl.java
                    └── componentscan
                        └── others
                            └── OtherGirl.java

Chúng ta đã đánh dấu hai bean bằng @Component ở hai class GirlOtherGirl. Khi chúng ta chạy ứng dụng, Spring Boot sẽ tự động quét và tạo các bean này.

@Component
public class Girl {
    @Override
    public String toString() {
        return "Girl.java";
    }
}

@Component
public class OtherGirl {
    @Override
    public String toString() {
        return "OtherGirl.java";
    }
}

Ứng dụng chính

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(App.class, args);
        try {
            Girl girl = context.getBean(Girl.class);
            System.out.println("Bean: " + girl.toString());
        } catch (Exception e) {
            System.out.println("Bean Girl không tồn tại");
        }

        try {
            OtherGirl otherGirl = context.getBean(OtherGirl.class);
            if (otherGirl != null) {
                System.out.println("Bean: " + otherGirl.toString());
            }
        } catch (Exception e) {
            System.out.println("Bean Girl không tồn tại");
        }
    }
}

Khi chúng ta chạy ứng dụng này, cả hai bean GirlOtherGirl đều được tạo ra và quản lý bởi Spring Boot.

Kết quả

Bean: Girl.java
Bean: OtherGirl.java

Kết quả in ra màn hình là cả hai bean đã được Spring Boot quét và tạo ra trong Context.

Tuỳ chỉnh Component Scan

Trong trường hợp bạn muốn tuỳ chỉnh cấu hình cho Component Scan để chỉ tìm kiếm các bean trong một package nhất định, bạn có hai cách sau đây:

Cách 1: Sử dụng @ComponentScan

Bạn có thể sử dụng Annotation @ComponentScan trên class App để chỉ định các package cần quét.

@ComponentScan("me.kungfutech.spring.componentscan.others")
@SpringBootApplication
public class App {
    // ...
}

Cách 2: Sử dụng scanBasePackages

Hoặc, bạn có thể sử dụng thuộc tính scanBasePackages trong Annotation @SpringBootApplication để chỉ định các package cần quét.

@SpringBootApplication(scanBasePackages = "me.kungfutech.spring.componentscan.others")
public class App {
    // ...
}

Kết quả sẽ chỉ quét và tạo bean trong package others.

Kết quả

Bean Girl không tồn tại
Bean: OtherGirl.java

Component Scan là một tính năng quan trọng trong Spring Boot giúp tự động tìm kiếm và quản lý các bean trong ứng dụng của bạn. Việc sử dụng Component Scan giúp giảm sự phức tạp trong việc cấu hình và quản lý các bean. Bằng cách mặc định, Spring Boot quét toàn bộ package và package con của class chứa hàm main. Tuy nhiên, bạn có thể tuỳ chỉnh cấu hình Component Scan để chỉ tìm kiếm trong các package cụ thể hoặc nhiều package khác nhau.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

junior

What are the differences between a Class component and Functional component?

junior

What is the difference between a Presentational component and a Container component?

junior

Component trong React là gì?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào