[Series] Spring Core - Keep It Simple (P4): Component

Trong phần 4 này, chúng ta sẽ tìm hiểu đến các component. Đây chính là các bean được sử dụng thường xuyên nhất trong các ứng dụng Spring.


1. Component là gì?

Như chúng ta đã biết, để định nghĩa một bean trong Spring, chúng ta sẽ cần sử dụng đến 2 annotation là @Configuration@Bean. Bên cạnh đó, Spring còn cho phép chúng ta tự động định nghĩa một bean thông qua cơ chế classpath scanning. Với cách định nghĩa ngầm này, các bean sẽ được gọi là các component.

Kể từ phiên bản 2.5, Spring đã cung cấp 4 stereotype annotation thuộc package org.springframework.stereotype là:

  • @Component: đây là annotation tổng quát để chỉ định 1 lớp là component.
  • @Controller: dùng để chỉ định 1 lớp thuộc presentation layer là component.
  • @Service: dùng để chỉ định 1 lớp thuộc business layer là component.
  • @Repository: dùng để chỉ định 1 lớp thuộc persistence layer là component.

Chúng ta hoàn toàn có thể thay thế @Controller, @Service@Repository bằng @Component. Nhưng nếu có thể, hãy sử dụng các stereotype annotation vào đúng ngữ cảnh để tăng ngữ nghĩa cho bean.

Cả 4 stereotype annotation này đều là annotation mức lớp.

Mặc định, tên của component chính là tên của lớp có viết thường chữ cái đầu tiên. VD: tên lớp là FooService => tên component là fooService. Chúng ta cũng có thể chỉ định tên của component thông qua thuộc tính value của 4 stereotype annotation.

Tuy nhiên, nếu chỉ khai báo các stereotype annotation thì chúng ta mới chỉ dừng lại ở việc xác định lớp đó là component mà vẫn chưa đăng ký component với Spring IoC container. Ngoại lệ org.springframework.beans.factory.NoSuchBeanDefinitionException sẽ được ném ra. Lúc này, chúng ta cần phải thực hiện classpath scanning thông qua annotation @ComponentScan. @ComponentScan cũng là một annotation mức lớp và được khai báo ở lớp có @Configuration. Thuộc tính basePackages chỉ ra một/nhiều package chứa các component.

@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig  {
}

Chú ý: Với component thì chúng ta không cần khai báo @Bean trong AppConfig như đã làm với các bean thông thường nhé.


2. Ví dụ

Chúng ta sẽ tạo một component fooService thuộc business layer và một component fooRepository thuộc persistence layer. fooRepository là dependency của fooService.

FooRepository.java

package org.ashina.tutorial.spring;

import org.springframework.stereotype.Repository;

@Repository
public class FooRepository {

    @Override
    public void doStuff() {
        System.out.println("This is fooRepository bean");
    }

}

FooService.java

package org.ashina.tutorial.spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class FooService {

    private final FooRepository fooRepository;

    @Autowired
    public FooService(FooRepository fooRepository) {
        this.fooRepository = fooRepository;
    }

    @Override
    public void doStuff() {
        fooRepository.doStuff();
    }

}

AppConfig.java

package org.ashina.tutorial.spring;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "org.ashina.tutorial.spring")
public class AppConfig {

}

Main.java

package org.ashina.tutorial.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        FooService fooService = ctx.getBean(FooService.class);
        fooService.doStuff();
        ctx.close();
    }

}

Kết quả:

This is fooRepository bean 

Tài liệu tham khảo

https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-classpath-scanning

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nguyễn Tuấn Anh

24 bài viết.
151 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
45 41
MyContact là một ứng dụng mà mình thường viết mỗi khi học một ngôn ngữ hay công nghệ mới. MyContact chỉ là một ứng dụng CRUD đơn giản, cho phép ngư...
Nguyễn Tuấn Anh viết hơn 2 năm trước
45 41
White
27 14
Hướng dẫn lập trình Spring Security Trong bài viết lần này, mình sẽ giúp các bạn bước đầu tìm hiểu (Link) thông qua xây dựng các chức năng: Đăng ...
Nguyễn Tuấn Anh viết hơn 2 năm trước
27 14
White
15 1
Giới thiệu Spring Framework Trong bài viết này, mình sẽ giới thiệu cho các bạn về một trong những Java EE framework rất nổi bật và phổ biến hiện n...
Nguyễn Tuấn Anh viết hơn 2 năm trước
15 1
Bài viết liên quan
White
0 0
Trong bài viết này, một số hình ảnh hoặc nọi dung có thể bị thiếu do quá trình chế bản. Vui lòng xem nội dung ở blog gốc sau: (Link) (Link), chúng...
programmerit viết gần 4 năm trước
0 0
White
0 0
Giới thiệu Trong bài hôm nay chúng ta sẽ tìm hiểu cách handle request POST của Spring Boot. Trước đó, bạn nên biết 1. 「Spring Boot 8」Tạo Web He...
https://loda.me viết 3 tháng trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
24 bài viết.
151 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!