2017-11-12 6 views
1

私は、コードがGoogle guice上にある間、私はSpringをベースとした外部jarを使用しています。Guiceアノテーションを追加しないGuice DIバインディング

モジュールを書くことで、このクラスの依存関係jarに依存関係を注入しようとしています。

外部クラス:

public class PTRS { 
    @Inject 
    private Event countEvent; 
    @Inject 
    private Event durationEvent; 
    private GeoServiceClient gClient; 
    public void setGeoServiceClient(GeoServiceClient client){this.gClient=client} 

} 

私は私のモジュールに@provides方法でセッターでメンバーを設定することですが、@Injectメンバーはnullを持っている、と私はcountEventとdurationEventためNullPointerExceptionが取得しています。

私のコードは、次のプロバイダクラスを使用して、PTRSクラスにバインドするオブジェクトを作成します。

@Provides 
PTRS new PTRS(Client client){ 
PTRS ptrs = new PTRS(); 
ptrs.setGeoServiceClient(client); 
return ptrs; 
} 

どのように外部クラスを変更せずにこれらの依存関係を注入できますか?

答えて

2

MembersInjector を入力して、guiceが作成しないオブジェクトに@Injectの名前付きフィールド(および@Inject -annotatedメソッドを呼び出す)を入力します。 Guiceはwikiの"On-demand injection"と呼んでいますが、他の言葉は聞いていません。あなたが自分自身の注射でInjector、へのアクセス権を持っている場合は

@Provides 
PTRS newPTRS(Client client, MembersInjector<PTRS> ptrsInjector){ 
    PTRS ptrs = new PTRS(); 
    ptrsInjector.injectMembers(ptrs); // <-- inject members here 
    ptrs.setGeoServiceClient(client); 
    return ptrs; 
} 

、あなたは直接injectMembers(Class)を呼び出す、またはお好みのタイプのMembersInjectorインスタンスを取得するためにgetMembersInjectorを呼び出すことができます。しかし、ここでのベストプラクティスは、読書の明確さと嘲笑の容易さのために、可能な限り狭いインターフェースとして注入することです。

+0

ありがとう、ジェフ!作品! :) –

関連する問題