2013-08-26 39 views
8

Tôi vẫn còn mới với Guice và chưa từng sử dụng bất kỳ khung công tác DI nào trước đây. Sau khi đọc wiki chính thức và nhiều tài liệu khác, tôi vẫn không thể quấn quanh đầu nó hoàn toàn.Guice - Tiêm phụ thuộc vào một lớp với các phương thức trợ giúp tĩnh

Trong trường hợp cụ thể của tôi, tôi muốn viết một chức năng taglib EL sử dụng một số lớp khác (để được tiêm). Vì tất cả các chức năng taglib phải được khai báo là tĩnh, tôi không thể chỉ @Inject sự phụ thuộc của tôi thông qua constructor hoặc setter. Tôi đã nghĩ đến việc sử dụng phương thức requestStaticInjection() được mô tả trong http://code.google.com/p/google-guice/wiki/Injections#Static_Injections nhưng tôi không thể làm cho nó hoạt động và không thể tìm thấy bất kỳ hướng dẫn tốt nào.

Cảm ơn trước sự giúp đỡ nào,

Arman

+2

"Tôi không thể làm cho nó hoạt động" Vì vậy, bạn đã thử những gì? –

Trả lời

16

Nó không nhận được nhiều hơn nữa rõ ràng hơn rằng tài liệu Guice nhưng đây là một thử nghiệm đơn vị cho thấy một ví dụ về cách bạn có thể sử dụng tiêm tĩnh:

public class StaticInjectionExample { 

    static class SomeClass {} 

    static class TagLib{ 
    @Inject 
    static SomeClass injected; 

    public static void taglibFunction(String foo) { 
     injected.something(foo); 
    } 

    } 

    static class TestModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     requestStaticInjection(TabLib.class); 
    } 
    } 

    @Test 
    public void test() { 
    Injector injector = Guice.createInjector(new TestModule()); 
    TagLib receiver = injector.getInstance(TagLib.class); 
    // Do something with receiver.injected 
    } 
} 
+0

Cảm ơn bạn đã trả lời cho câu trả lời của bạn. Tôi sẽ thử nó. Nhưng điều này có tôn trọng bất kỳ sự hư hỏng nào do các Kim chích khác tiêm vào không? Ví dụ, Guice sẽ sử dụng cùng một thể hiện nếu lớp được tiêm đã được đánh dấu là @Singleton? – Arman

+0

Tôi không chắc chắn những gì bạn có ý nghĩa của "kim phun khác". Nếu bạn ràng buộc 'Tiêm' là' @ Singleton' thì trường hợp đơn lẻ đó sẽ được sử dụng trong khi tiêm (bao gồm cả tiêm tĩnh) cho toàn bộ mô-đun. – condit

+0

Theo tài liệu Guice, bạn thường tạo một Injector trong một dự án web bên trong một ServletContextListener mở rộng GuiceServletContextListener. Vì vậy, nếu tôi tạo thêm một Injector bên trong một số lớp, thì Guice sẽ tiêm cùng lớp @Singleton như "ServletContextListener-Injector" sẽ có? – Arman

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