3

Guice を使用して特定のフィールド インスタンスを挿入する際に、いくつかの問題が発生しています。

これが私が現在持っているものです:

class Driver {
   private ThreadLocal<Database> db;

   ...
}

私は通常、コンストラクターで db インスタンスを渡すだけです。しかし、このクラスは偽装を使用して傍受されます。

モジュールは次のとおりです。

 class MyGuiceModule extends AbstractModule {

    private ThreadLocal<Database> dbToInject;

    public MyGuiceModule(ThreadLocal<Database> dbToInject) {
         this.dbToInject = dbToInject;
    }

    @Override
    protected void configure() {

         // Binds the interceptor.
         bindInterceptor(....);

         bind(ThreadLocal.class).toInstance(this.dbToInject);
    }
 }

そして、これが私がすべてのものをインスタンス化する方法です:

Injector injector = new Injector(new MyGuiceModule(db));
Driver driver = injector.getInstance(Driver.class);

かなり明白だと思いますが、ここで何が間違っているのでしょうか?

編集:

わかりにくかったらごめんなさい。私の問題は、これが機能していないことです。インスタンスは注入されていません。@Inject でフィールドに注釈を付けましたが、まだ機能しません。

4

2 に答える 2

5
  1. インジェクターインスタンスを作成するには、 Guice.createInjectorを使用する必要があると思います。

    インジェクターを作成する方法は次のとおりです。

    Injector injector = Guice.createInjector(new MyGuiceModule(db));
    
  2. もう 1 つのことは、バインディングを実行するために次のコードを使用したことです。

    bind(ThreadLocal.class).toInstance(this.dbToInject);
    

    通常、次のようになります。

    bind(MyInterface.class).toInstance(MyImplementation.class);
    

    ThreadLocal.class はインターフェイス クラスではなく、 this.dbToInject は実装クラスではありません。

ドキュメントは次のとおりです。

http://code.google.com/p/google-guice/wiki/モチベーション

お役に立てれば。

于 2013-05-28T05:24:25.003 に答える
2

直接注入するのではなく、データベースをコンストラクターに注入する方がおそらく良いでしょうThreadLocal(@Tobiasが示唆したように)。そして、作成されたドライバーのすべてのインスタンスに対して同じデータベースを本当に使用したいですか (コメントのオプションのシングルトンに注意してください)。

public class GuiceExample {

  public static class MyGuiceModule extends AbstractModule {
    @Override
    protected void configure() {
      bind(Driver.class);
    }

    @Provides
    //Uncomment this to use the same Database for each Driver
    //@Singleton
    Database getDatabase() {
      return new Database();
    }
  }

  @Test
  public void testInjection() {
    Injector i = Guice.createInjector(new MyGuiceModule());
    i.getInstance(Driver.class);
  }

  public static class Database {}

  public static class Driver {
    ThreadLocal<Database> db = new ThreadLocal<Database>();

    @Inject
    Driver(Database db) {
      this.db.set(db);
    }
  }

}
于 2013-05-27T20:28:07.827 に答える