2012-02-20 76 views
3

我對使用Inject on變量有點失落。GIN @注入用於Rpc服務的變量

我得到這個代碼的工作:

private XXServiceAsync xxServiceAsync; 

@Inject 
protected IndexViewImpl(EventBus eventBus, XXServiceAsync tableManagementServiceAsync) { 
    super(eventBus, mapper); 

    this.xxServiceAsync = xxServiceAsync; 
    initializeWidgets(); 
} 

有了這個代碼,我可以打電話給我的RPC服務,無論我需要在類(在點擊...) 我想清楚了一下代碼通過直接注入變量;這樣做:

@Inject 
private XXServiceAsync xxServiceAsync; 


protected IndexViewImpl(EventBus eventBus) { 
    super(eventBus, mapper); 
    initializeWidgets(); 
} 

這始終使服務爲NULL。 我做錯了什麼? rpc服務的GIN魔法是否意味着要做其他事情?

謝謝!

回答

5

在這一點上它仍然是空的,因爲Gin(和Guice以及其他像這樣的框架)在構造函數完成運行之前不能分配字段。

考慮如何做到這一點看,如果你是手動佈線的代碼(記住,杜松子酒/吉斯會騙一點來分配私有字段,調用非可視方法):

MyObject obj = new MyObject();//initializeWidgets() runs, too early! 
obj.xxServiceAsync = GWT.create(xxService.class); 

如果你需要的東西構造函數將其傳遞給構造函數。如果你不需要它(例如直到調用asWidget()),那麼用@Inject註釋的字段或setter可能會有所幫助。

+0

非常感謝指出構造函數完成運行後分配字段。 – 2012-02-21 09:26:57

0

如果您有字段級別注入,則可以使用空的@Inject方法執行注入後初始化。註冊完畢後,無參數注入方法將在現場注入後運行。

@Inject void initialize(){ 
    ... 
    initializeWidgets() 
} 

編輯:我之前說過它也是在注射方法後運行的,但是測試表明這並非總是如此。

+0

請參閱InjectionPoint.getInjectionPoints以獲取實際生成將爲類運行的注入列表的代碼。它看起來像它將走向類型層次注入字段,然後爲每個超類的方法。這意味着如果你的類有一個Inject方法,它肯定會在類的任何Inject字段之後運行。但依靠這種行爲肯定是不好的做法。 (這是在Guice代碼中,但是杜松子酒生成的代碼很可能類似) – idle 2012-02-21 01:47:15