hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Lập trình Python
    • Git và Github
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
    • Mạng và truyền thông
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Spring Boot
Spring Boot bài 03: Bean, IoC và Dependency Injection qua constructor
Java và Spring Boot – MVC và REST API

Spring Boot bài 03: Bean, IoC và Dependency Injection qua constructor

  • 18-10-2026
  • Toanngo92
  • 0 Comments

Giáo trình Spring Boot MVC và REST API · Chương 2/12: Bean, kiến trúc và cấu hình · Bài 03/28 · Biên soạn tháng 10/2026.

← Bài 02 · Mục lục 12 chương · Bài 04 →

Mục lục

  • Mục tiêu bài học
  • Vấn đề khi tự tạo mọi đối tượng
  • Vì sao tiêm qua constructor?
  • Khi nào dùng @Bean?
  • Vòng đời và trạng thái dùng chung
  • Đọc lỗi khởi động theo quan hệ phụ thuộc
  • Lỗi thường gặp và lưu ý
  • Ghi nhớ
  • Tài liệu đối chiếu

Mục tiêu bài học

Hiểu Spring tạo và nối các đối tượng thế nào; biết chọn constructor injection và phân biệt đối tượng do Spring quản lý.

Vấn đề khi tự tạo mọi đối tượng

Một Controller cần CourseService, còn CourseService cần CourseRepository và CategoryRepository. Nếu Controller tự dùng new để tạo toàn bộ chuỗi này, nó phải biết cả cấu hình dữ liệu và cách khởi tạo các phụ thuộc. Thay cách lưu dữ liệu hoặc viết test trở nên khó hơn vì các đối tượng bị gắn chặt với nhau.

IoC là việc chuyển quyền tạo và quản lý các thành phần phù hợp cho container. Bean là đối tượng được Spring quản lý trong container đó. Dependency Injection là cách Spring cung cấp phụ thuộc cho đối tượng, thay vì đối tượng tự tìm hoặc tự tạo chúng. Đây là cơ chế tổ chức chương trình, không phải phép thuật thay thế thiết kế.

Tệp trong mã nguồn mẫu: src/main/java/com/hocvietcode/academy/CourseService.java. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.

@Service @Transactional(readOnly=true)
public class CourseService {
    private final CourseRepository courses; private final CategoryRepository categories;
    public CourseService(CourseRepository courses,CategoryRepository categories){this.courses=courses;this.categories=categories;}

Vì sao tiêm qua constructor?

CourseService khai báo hai trường final và nhận đủ phụ thuộc qua constructor. Nếu thiếu repository, việc tạo service thất bại sớm thay vì chờ đến một request rồi mới gặp null. Với một constructor, không cần ghi thêm @Autowired. Trong unit test, ta có thể truyền mock repository mà không khởi động Spring.

@Service được component scan phát hiện. Repository là interface, nhưng Spring Data cung cấp implementation khi khởi động dựa vào JpaRepository. Không cần tự viết class CourseRepositoryImpl cho CRUD có sẵn. Controller nhận CourseService theo cùng nguyên tắc, nên tuyến phụ thuộc đi từ web xuống nghiệp vụ rồi đến dữ liệu.

Khi nào dùng @Bean?

Với class do mình viết, @Service hoặc @Component thường đủ. Với đối tượng của thư viện hoặc đối tượng cần lắp ráp theo cấu hình, đặt một phương thức @Bean trong @Configuration. AppConfig tạo RestClient từ builder, địa chỉ gốc và timeout. SecurityConfig tạo PasswordEncoder và SecurityFilterChain bằng cách này.

Điểm cần nhớ là gọi new cho một đối tượng thuần Java không tự động làm nó trở thành bean. Nếu tự new CourseService bên ngoài Spring, các hành vi dựa trên proxy như @Transactional cũng không tự hoạt động. Ta vẫn dùng new bình thường cho DTO, entity hoặc giá trị không cần vòng đời của container.

Vòng đời và trạng thái dùng chung

Mặc định, phần lớn bean là singleton trong một application context. Điều đó không có nghĩa chỉ có một đối tượng cho mọi chương trình trên máy; nó có nghĩa một instance được các request trong context dùng chung. Vì vậy không đặt currentUser, danh sách khóa học đang sửa hay dữ liệu riêng của request vào trường mutable của Service.

Các biến cục bộ của phương thức giúp tách dữ liệu theo lần gọi. Trạng thái nghiệp vụ cần lưu vào cơ sở dữ liệu, còn thông tin đăng nhập do hệ thống Security quản lý. Nếu hai service phụ thuộc vòng vào nhau, hãy xem lại trách nhiệm và hướng gọi trước khi tìm cách bật circular references.

Đọc lỗi khởi động theo quan hệ phụ thuộc

Thông báo No qualifying bean thường cho biết chưa có bean phù hợp: thiếu annotation, class nằm ngoài package scan hoặc cấu hình không được nạp. Nếu có hai bean cùng kiểu, Spring cần biết chọn bean nào qua @Qualifier hoặc @Primary. Hãy đọc phần nguyên nhân cuối của stack trace để tìm mắt xích thực sự bị lỗi.

Lỗi thường gặp và lưu ý

  • Không dùng field của singleton bean để lưu thông tin riêng của người đang truy cập.
  • Không thêm @Autowired vào mọi nơi như một cách chữa lỗi thiếu dependency; hãy kiểm tra bean có được tạo đúng không.

Ghi nhớ

Constructor thể hiện rõ mỗi class cần gì. Container chịu trách nhiệm nối phụ thuộc, còn class tập trung làm đúng công việc của nó.

Tài liệu đối chiếu

  • Dependency Injection

← Bài 02 · Mục lục 12 chương · Bài 04 →

Bài viết liên quan:

Java và Spring Boot – MVC và REST API
Spring Boot bài 09: Binding biểu mẫu tạo và sửa khóa học
Java và Spring Boot – MVC và REST API
Spring Boot bài 25: Unit test Service với JUnit và Mockito
Java và Spring Boot – MVC và REST API
Spring Boot bài 10: Validation và BindingResult: báo lỗi ngay trên biểu mẫu
Java và Spring Boot – MVC và REST API
Spring Boot bài 26: Integration test MVC, API, database và Security
Java và Spring Boot – MVC và REST API
Spring Boot bài 11: Post/Redirect/Get, flash message và session
Java và Spring Boot – MVC và REST API
Spring Boot bài 27: Logging, Actuator và quản lý schema bằng Flyway
Java và Spring Boot – MVC và REST API
Spring Boot bài 12: JPA Entity, Repository, H2 và migration đầu tiên
Java và Spring Boot – MVC và REST API
Spring Boot bài 28: Đóng gói JAR, Docker và cấu hình triển khai
Java và Spring Boot – MVC và REST API
Spring Boot bài 13: Kết nối MySQL, CRUD và transaction trong Service
Java và Spring Boot – MVC và REST API
Giáo trình Spring Boot MVC và REST API 2026: 12 chương, 28 bài
Java và Spring Boot – MVC và REST API
Spring Boot bài 14: Quan hệ JPA, DTO và tránh truy vấn N+1
Java và Spring Boot – MVC và REST API
Spring Boot bài 15: Tìm kiếm, phân trang và sắp xếp có kiểm soát

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 05: Đơn vị và kích thước: px, rem, %, min và max

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 02: Selector và class: chọn đúng phần tử cần sửa

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 01: Kết nối CSS với HTML và sửa quy tắc đầu tiên

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 20: Hoàn thiện website và sửa lỗi bằng DevTools

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 03: Vì sao CSS không có tác dụng? Cascade và specificity

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×