Annotation @ConditionalOnBean trong Spring Boot

Mình đã giới thiệu với các bạn về annotation @Conditional trong Spring với mục đích cho phép chúng ta định nghĩa các điều kiện để một bean có thể được khởi tạo trong Spring container. Chúng ta sẽ cần phải implement interface Condition với abstract method là matches() return true hoặc false để thể hiện việc thoả hay không thoả các điều kiện này. Spring Boot provide cho chúng ta một số implementation cho interface Condition cùng với các annotation tương ứng giúp chúng ta có thể giải quyết nhiều bài toán thực tế khi làm việc với các ứng dụng Spring Boot. Một trong số đó là annotation @ConditionalOnBean.

Annotation @ConditionalOnBean của Spring Boot được sử dụng với mục đích cho Spring biết rằng, class hoặc method được annotate với annotation này chỉ được khởi tạo bean trong Spring container nếu trong Spring container đã tồn tại bean của một class khác.

Ví dụ mình có 2 class đơn giản như sau:

và:

Để cấu hình bean cho các class trên trong Spring container, mình sẽ định nghĩa một class được annotate với annotation @Configuration như sau:

Lúc này, nếu các bạn lấy thông tin Student được định nghĩa trong Spring container:

các bạn sẽ thấy kết quả như sau:

Nếu bây giờ mình muốn bean của class Student chỉ được khởi tạo nếu trong Spring container đã tồn tại bean của class Clazz thì mình có thể annotate method định nghĩa bean của class Student trong class ApplicationConfiguration như sau:

Trong trường hợp trong Spring container chưa định nghĩa bean cho class Clazz:

thì các bạn sẽ thấy lỗi sau khi chạy lại ví dụ:

Nếu các bạn định nghĩa bean cho class Clazz:

thì sẽ không thấy lỗi nữa.

Nếu các bạn take a look vào nội dung của annotation @ConditionalOnBean, các bạn sẽ thấy, annotation này sử dụng dụng annotation @Conditional cùng với implementation của interface Condition là OnBeanCondition:

Các bạn có thể đọc code của class OnBeanCondition nếu muốn tìm hiểu thêm cách mà Spring Boot hiện thực condition này như thế nào các bạn nhé!

Như các bạn thấy, ngoài việc sử dụng tên class để khai báo trong annotation @ConditionalOnBean, chúng ta còn có thể sử dụng một số cách khác để khai báo các điều kiện. Ví dụ như chúng ta có thể sử dụng tên của bean trong Spring container để khai báo trong thuộc tính name của annotation @ConditionalOnBean như sau:

Add Comment