Theo the Javadoc for Autowired, chú thích có thể được sử dụng trên "phương thức khởi tạo, trường, phương thức setter hoặc phương thức cấu hình". Xem the full documentation để biết thêm chi tiết.
Cá nhân tôi thích lựa chọn đầu tiên của bạn (constructor injection), bởi vì lĩnh vực myDao
có thể được đánh dấu là thức: tiêm
@Controller
public class MyControllear {
private final MyDao myDao;
@Autowired
public MyController(MyDao myDao) {
this.myDao = myDao;
}
Constructor cũng cho phép bạn kiểm tra các lớp trong một thử nghiệm đơn vị mà không mã mà phụ thuộc vào Mùa xuân.
Lựa chọn thứ hai sẽ được viết tốt hơn như:
@Controller
public class MyControllear {
@Autowired
private MyDao myDao;
MyController() {
}
Với tiêm lĩnh vực, Spring sẽ tạo ra các đối tượng, sau đó cập nhật các trường đánh dấu để tiêm.
Một tùy chọn mà bạn đã không đề cập được đặt @Autowired
trên một phương pháp setter (setter injection):
@Controller
public class MyControllear {
private MyDao myDao;
MyController() {
}
@Autowired
public void setMyDao(MyDao myDao) {
this.myDao = myDao;
}
Bạn không cần phải chọn một hay cách khác. Bạn có thể sử dụng trường tiêm cho một số phụ thuộc và tiêm constructor cho những người khác cho cùng một đối tượng.
Theo thử nghiệm tôi vừa tạo (với Spring 3.0), trường có thể được đánh dấu là "cuối cùng" cũng ở tùy chọn thứ hai, tức là có vẻ như hoạt động tốt để đặt @Autowired trên trường cuối cùng và trong thời gian chạy! Tôi cho rằng nó hoạt động vì Spring bỏ qua công cụ sửa đổi "cuối cùng" khi nó đặt trường thông qua sự phản chiếu. Bất cứ ai có thể xác nhận/tỏa sáng một số ánh sáng vào điều này? –
@Mikko Tôi rất ngạc nhiên khi làm việc. Công cụ sửa đổi "cuối cùng" cung cấp một số bảo đảm cho đồng thời. Nếu mùa xuân đang sửa đổi các lĩnh vực cuối cùng sau khi xây dựng, bạn đang mất một số những lợi ích đó. – NamshubWriter