2012-04-13 30 views
12

sự hiểu biết của tôi về Guice là:Guice: tác động của tiêm lĩnh vực

  • tiêm Constructor cấp (@Inject public class Widget(Dep one, Dep two)) ngụ ý rằng Guice sẽ luôn luôn tiêm constructor rằng mỗi khi nó được gọi thông qua một Injector; và
  • tiêm Phương pháp cấp (@Inject public void setDepOne(Dep one)) ngụ ý rằng Guice sẽ luôn luôn tiêm rằng phương pháp bất cứ khi nào nó được gọi là, miễn là đối tượng Widget đã được tạo ra bằng cách sử dụng Guice Injector

Are hai giả định này có đúng không? Nếu không, xin vui lòng làm rõ!

Vì vậy, những gì tôi bị treo lên là: các tác động của việc bơm cấp trường là gì?

@Inject private Dep one; 

Điều này có nghĩa là Guice sẽ luôn bơm thuộc tính khi đối tượng được tạo ra thông qua vòi phun Guice? Trong trường hợp đó tôi sẽ tưởng tượng nó xung đột với việc xây dựng cấp độ tiêm.

Ví dụ, nào sau đây gây ra một cuộc xung đột/lỗi:

public class Widget { 
    @Inject private Dep one; 

    private Dep two; 

    // Dep one already injected as a field! 
    @Inject public Widget(Dep one, Dep two) { 
     // ... 
    } 
} 

Cảm ơn trước!

Trả lời

0

Giả định của bạn là chính xác. Tôi tin rằng trong trường hợp cụ thể này Guice sẽ tiêm one hai lần - một lần thông qua các nhà xây dựng, một lần thông qua lĩnh vực này - nếu không có gì khác, bởi vì nó không thể biết rằng họ đang đi đến cùng một lĩnh vực.

19

Guice sẽ luôn tiêm tất cả các trường, phương thức và bất kỳ hàm tạo nào được chú thích với @Inject. Hãy nhớ rằng hàm tạo luôn luôn được tiêm đầu tiên, vì vậy trường chú thích của bạn sẽ thực sự ghi đè quá trình tiêm đó. Hãy ví dụ sửa đổi này:

class Widget { 
    @Inject 
    private Dep one; 

    @Inject 
    public Widget(Dep one) { 
     this.one = one; 
     System.out.println(one); 
    } 

    public void printDependency() { 
     System.out.println(one); 
    } 
} 

class Dep {} 

public class MyMain { 
    public static void main(String[] args) { 
     Injector i = Guice.createInjector(); 
     i.getInstance(Widget.class).printDependency(); 

    } 
} 

Khi chạy, điều này sẽ tạo ra một cái gì đó như thế này:

[email protected] 
[email protected] 

Rõ ràng hai đối tượng khác nhau. Dòng đầu tiên là hàm tạo; thứ hai là tiêm trường.

Tôi thường không tìm thấy cách sử dụng để tiêm trường, ngoại trừ giảm độ trong khi viết mẫu mã Guice. Trong mã sản xuất nó không khôn ngoan bởi vì nó làm cho mã khó kiểm tra.

+0

Guice sẽ luôn tạo một phiên bản mới của mọi phụ thuộc mà nó chèn trừ khi nó tìm thấy một số ràng buộc khác, chẳng hạn như singleton. – logan

+0

bạn có thể giải thích tại sao nó không tốt để thử nghiệm? – suitianshi

+0

Trong trường hợp này, các trường được chèn là riêng tư, điều này khiến chúng khó truy cập mà không cần sử dụng một cái gì đó giống như sự phản chiếu. –

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