Setter_Injection
Setter Injection là một phương pháp Dependency Injection (DI) trong Spring, trong đó dependencies được inject vào Bean thông qua phương thức setter (setXxx
).
Mặc dù Constructor Injection được ưu tiên trong hầu hết các trường hợp, nhưng Setter Injection vẫn hữu ích khi dependency không bắt buộc hoặc có thể thay đổi sau khi Bean được tạo.
1. Vì Sao Nên Dùng Setter Injection?
✅ Ưu điểm
Linh hoạt: Có thể thay đổi dependency sau khi Bean đã được tạo.
Không gây lỗi Circular Dependency: Tránh vòng lặp khi hai Bean phụ thuộc lẫn nhau.
Dễ sử dụng với các framework như Spring MVC (các controllers có thể sử dụng Setter Injection để nhận Bean).
❌ Nhược điểm
Không đảm bảo bất biến (Immutability): Các dependencies có thể bị thay đổi sau khi Bean được tạo.
Không đảm bảo dependency luôn tồn tại: Nếu quên gọi setter, dependency có thể bị
null
.Khó test hơn Constructor Injection vì cần gọi setter trong Unit Test.
2. Cách Dùng Setter Injection trong Spring
Có thể thực hiện Setter Injection bằng Annotations, Java Configuration, hoặc XML Configuration.
2.1. Setter Injection với @Autowired
@Autowired
🟢 Lưu ý: Nếu UserRepository
chưa được inject, userRepository
có thể bị null
.
2.2. Setter Injection với @Bean
trong Java Configuration
@Bean
trong Java ConfigurationNếu không dùng @Component
, có thể khai báo Bean bằng @Configuration
và inject bằng setter.
🟢 Ưu điểm: Linh hoạt, có thể cấu hình dependency lúc runtime.
**2.3. Setter Injection với XML Configuration (Cũ)
🛑 Không còn phổ biến, nhưng vẫn hữu ích trong các dự án cũ.
3. Khi Nào Nên Dùng Setter Injection?
✅ Dùng khi:
Dependency không bắt buộc (ví dụ: Logger, Audit Service).
Cần thay đổi dependency sau khi Bean được khởi tạo.
Tránh Circular Dependency khi Constructor Injection gây vòng lặp.
❌ Không dùng khi:
Dependency luôn bắt buộc (nên dùng Constructor Injection).
Cần đảm bảo immutability và dễ kiểm thử.
4. So Sánh Constructor Injection vs Setter Injection
Feature
Constructor Injection
Setter Injection
Khả năng kiểm thử (Testability)
✅ Dễ test với Mockito
❌ Cần gọi setter trong test
Bất biến (Immutability)
✅ Bất biến
❌ Có thể thay đổi
Dễ phát hiện lỗi thiếu dependency
✅ Phát hiện ngay khi chạy ứng dụng
❌ Có thể bị null
nếu quên gọi setter
Circular Dependency
❌ Có thể gây lỗi vòng lặp
✅ Không gây lỗi vòng lặp
Khả năng mở rộng
✅ Tốt cho class lớn
✅ Linh hoạt
✅ Tóm lại:
Dùng Constructor Injection cho dependencies bắt buộc.
Dùng Setter Injection khi dependency có thể thay đổi hoặc không bắt buộc.
6. Kết Luận
🔹 Setter Injection linh hoạt hơn nhưng không đảm bảo dependency luôn tồn tại. 🔹 Dùng Setter Injection khi dependency có thể thay đổi hoặc không bắt buộc. 🔹 Constructor Injection vẫn là lựa chọn tốt hơn trong hầu hết các trường hợp.
Last updated