Bắt đầu từ spring 2.5, framework giới thiệu một chú thích mới @autowired, cho phép spring tự động tìm kiếm và thêm các bean tương ứng mà chúng ta khai báo trong lớp.

Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu một số cách sử dụng chú thích @autowired trong mùa xuân và cách xử lý xung đột khi nhiều bean có thể được sử dụng trong một lớp cụ thể.

Bật chú thích @autowired vào mùa xuân

spring cho phép tự động đưa các phụ thuộc vào tự động, vì vậy chúng ta chỉ cần khai báo các bean có chú thích @bean hoặc các lớp được chú thích bằng chú thích @component trong tệp cấu hình và bộ chứa spring ioc sẽ tự động và tự động đưa các phụ thuộc tương ứng mà chúng ta khai báo và sử dụng.

Trong ví dụ bên dưới, tôi tạo một bean công ty thông qua @componentscan (để chỉ ra vị trí cần tìm các lớp @component) và đặt bean địa chỉ vào tệp cấu hình (sử dụng chú thích @configuration)

Hơn cả sự mong đợi, khi sử dụng spring boot bạn chỉ cần sử dụng chú thích @springbootapplication. Nó là một chú thích kết hợp @configuration, @enableautoconfiguration và @componentscan. Thường được sử dụng với lớp chính trong ứng dụng khởi động mùa xuân, để chỉ định rằng mùa xuân sẽ tìm kiếm các hạt đậu ở cùng cấp độ hoặc trong gói con của lớp chính.

Cách sử dụng @autowired

Khi bean được khởi tạo và đăng ký vào spring ioc, bạn có thể sử dụng @autowired để thêm bean tương ứng để sử dụng. Spring cung cấp cho chúng ta 3 cách để sử dụng @autowired annotations trên constructor, setters hoặc trực tiếp trên property.

@autowired trực tiếp trên thuộc tính

Đây là cách sử dụng ngắn gọn và nhanh nhất, chúng ta chỉ cần chú thích @autowired trực tiếp vào thuộc tính. Spring ioc sẽ tự động tìm kiếm và đưa các bean tương ứng thông qua API phản chiếu.

Đầu tiên, giả sử tôi có một hạt đậu như ví dụ này

Sau đó, tôi đã đưa một bean exampleclassbean vào dịch vụ ví dụ và thêm chú thích @autowired vào thuộc tính.

Bây giờ chúng ta có thể kiểm tra xem việc gọi phương thức getname() có trả về giá trị đã khai báo trước đó là “deft blog” hay không.

@autowired trên các phương thức setter

Thông thường, các phương thức setter được sử dụng để khởi tạo hoặc cập nhật giá trị của một thuộc tính trong một lớp. Đây cũng là một nơi lý tưởng để mùa xuân tiêm các phụ thuộc.

Bây giờ, tôi sẽ tạo một setterexampleservice để đưa setterbean vào phương thức setter.

@autowired constructor

Cuối cùng, chúng ta có thể sử dụng @autowired trên hàm tạo và spring sẽ tự động tìm bean tương ứng được khai báo làm tham số trong hàm tạo.

Trong ví dụ này, mình sẽ sử dụng lại fieldbean và setterbean làm 2 tham số trong hàm tạo, và spring sẽ tự động tìm kiếm 2 bean này để sử dụng trong dịch vụ.

Bạn có thể chạy các bài kiểm tra đơn vị sau để kiểm tra kết quả

@autowired với các phụ thuộc tùy chọn

Khi spring không thể tìm thấy bean trong container và inject nó vào nơi cần sử dụng, một ngoại lệ sẽ được ném ra và chương trình sẽ không bắt đầu.

Để khắc phục lỗi này, chúng ta có thể sử dụng thuộc tính bắt buộc trong chú thích @autowired để đặt thuộc tính này thành false, giá trị mặc định là true và một lỗi sẽ được báo cáo khi không thể tìm thấy phần phụ thuộc được chú thích bởi chú thích @autowired.

Tuy nhiên, trên thực tế, phương pháp này hiếm khi được sử dụng. Nói chung, bạn phải đảm bảo rằng đủ đậu được tạo trong thời gian chạy ứng dụng.

Các trường lỗi khi sử dụng @autowired

Theo mặc định, mùa xuân sẽ tìm kiếm các phần phụ thuộc được đánh dấu bằng chú thích @autowired dựa trên các loại dữ liệu. Nó sẽ đưa ra một ngoại lệ nếu có nhiều bean có cùng kiểu dữ liệu trong vùng chứa.

Để xử lý xung đột này, chúng tôi phải chỉ định loại đậu nào chúng tôi muốn trong số các loại đậu có cùng loại dữ liệu tồn tại trong vùng chứa.

@autowired và @qualifier

Đây là cách phổ biến để chỉ định bean mà chúng ta cần sử dụng trong số nhiều bean có cùng kiểu dữ liệu.

Giả sử tôi có một trình định dạng có 2 bean, cả hai đều triển khai nó

Trong ví dụ trên, chúng ta có 2 bean có cùng kiểu dữ liệu của bộ định dạng nên khi chúng ta khởi tạo dịch vụ clashserviceexample với bộ định dạng phụ thuộc sẽ gây ra lỗi

Không có bean đủ điều kiện thuộc loại ‘com.deft.autowireddemo.conflict.formatter’: Dự kiến ​​có một bean phù hợp duy nhất nhưng tìm thấy 2: bar, fooat org.springframework.beans.factory.config.dependencydescriptor.resolvenotunique(dependencydescriptor.java : 220)

Để tránh xung đột này, chúng ta có thể sử dụng @qualifier để chỉ định tên của bean mà chúng ta muốn sử dụng.

Tự động kết nối theo tên

Có thể hiểu ngầm là

Vì trong trường hợp này không có bean trùng tên nên spring chỉ tìm theo kiểu dữ liệu và tìm 2 bean foo và bar tương ứng.

Vì vậy, bạn không thể sử dụng chú thích @qualifier, chỉ cần thay đổi nó thành tên tương ứng với tên bean mà bạn muốn sử dụng.

Giống đoạn code sau, mình dùng foo bean, không dùng @qualifier, chỉ đổi tên thuộc tính tương ứng với @component name(foo) đã đặt trước đó

Kết thúc khóa học

Thông qua bài viết này, chúng ta sẽ tìm hiểu cách tự động chèn các phụ thuộc bằng cách sử dụng @autowired. Có 3 cách để áp dụng @autowired, tuy nhiên, mọi người nói rằng bạn nên sử dụng hàm tạo có sẵn tự động vì nó nhanh hơn sử dụng phản chiếu để khởi tạo với các trường có sẵn tự động. Không chỉ vậy, khi sử dụng constructor có quá nhiều tham số, điều đó có nghĩa là chúng ta có thể đang vi phạm các nguyên tắc vững chắc, bởi vì nhiều phụ thuộc có nghĩa là lớp của chúng ta chịu trách nhiệm xử lý quá nhiều logic.

Cuối cùng, bạn có thể xem công khai mã nguồn của mình trên gitlab và chạy thử nghiệm nếu cần: autowired-demo.

Tài liệu tham khảo

Kiểm tra tiếng Anh trực tuyến

Bạn đã biết trình độ tiếng Anh hiện tại của mình chưa?
Bắt đầu làm bài kiểm tra

Nhận tư vấn lộ trình từ ACET

Hãy để lại thông tin, tư vấn viên của ACET sẽ liên lạc với bạn trong thời gian sớm nhất.