28

Điều nào chính xác hơn?Chú thích @Autowired phải đi đến đâu - trên thuộc tính hoặc phương pháp?

Điều này (với chú thích @Autowired về phương pháp)?

@Controller 
public class MyController 
{ 
    private MyDao myDao; 

    @Autowired 
    public MyController(MyDao myDao) 
    { 
     this.myDao = myDao; 
    } 

Điều này (có chú thích @Autired trên tài sản)?

@Controller 
public class MyController 
{ 
    @Autowired 
    private MyDao myDao; 

    public MyController(MyDao myDao) 
    { 
     this.myDao = myDao; 
    } 

Chú thích @Autired phải đi đâu?

Trả lời

47

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.

+2

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? –

+0

@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

0

Chú thích đi kèm với thuộc tính, bởi vì đó là những gì đang được autowired; thuộc tính được đặt tự động. This tutorial có một ví dụ hay. This more advanced example cho biết cách sử dụng vòng loại để phân biệt hệ thống dây điện.

Các vấn đề liên quan