[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

30 bài viết.
249 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
52 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 3 năm trước
52 41
White
34 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 3 năm trước
34 14
White
19 0
Trước đây khi mới học Spring, mình thường nhảy thẳng lên tìm hiểu các project như Spring MVC hay Spring Boot để viết ứng dụng, thỉnh thoảng mới ngó...
Nguyễn Tuấn Anh viết hơn 1 năm trước
19 0
Bài viết liên quan
White
3 0
I used Spring boot, Hibernate few times back then at University, I'v started using it again recently. In this (Link), I want to check how Spring J...
Rey viết 1 năm trước
3 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
30 bài viết.
249 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á!