1

Guiceコンテナのすべてのバインドされたオブジェクトを繰り返し処理したいと思います。たとえば、呼び出すときに、GuiceコンテナによってgetInstance作成済みのインスタンスを取得したいとします。UserManagerImplしかし、Guiceは代わりに新しいものを作成します。

GuiceModule mainModule = new GuiceModule();
Injector injector = Guice.createInjector(mainModule);
Map<Key<?>, Binding<?>> bindings = injector.getAllBindings();
for (Binding<?> binding : bindings.values()) {
  Object instance = injector.getInstance(binding.getKey());
}

以下はGuiceModuleの設定例です。

public class GuiceModule extends AbstractModule {
    @Override
    protected void configure() {
         bind(UserManager.class).to(UserManagerImpl.class).in(Singleton.class);
     }
}
4

1 に答える 1

4

代わりに、このバインディングを使用する必要があります。

    bind(UserManagerImpl.class).in(Singleton.class);
    bind(UserManager.class).to(UserManagerImpl.class);

UserManagerImplこれは、インターフェイスではなく、実際のシングルトンであることに注意してください。そのように両方を呼び出す

injector.getInstance(UserManager.class);
injector.getInstance(UserManagerImpl.class);

同じインスタンスになります。すべてのバインディングを繰り返して呼び出すgetInstanceことで、後で呼び出したものも呼び出します。これはマークされておらずSingleton、ビンゴです。いくつかのインスタンスがあります。

それで....

ただし、他の理由ですべてのシングルトンを取得する必要がある場合は、次のBindingScopingVisitorように使用します。

    BindingScopingVisitor<Boolean> visitor = new IsSingletonBindingScopingVisitor();
    Map<Key<?>, Binding<?>> bindings = injector.getAllBindings();
    for (Binding<?> binding : bindings.values()) {
        Key<?> key = binding.getKey();
        System.out.println("Examing key "+ key);

        Boolean foundSingleton = binding.acceptScopingVisitor(visitor);
        if( foundSingleton ) {
            Object instance = injector.getInstance(key);
            System.out.println("\tsingleton: " + instance);
        }
    }

class IsSingletonBindingScopingVisitor implements BindingScopingVisitor<Boolean> {
    @Override
    public Boolean visitEagerSingleton() {
        System.out.println("\tfound eager singleton");
        return Boolean.TRUE;
    }

    @Override
    public Boolean visitScope(Scope scope) {
        System.out.println("\t scope: "+scope);
        return scope == Scopes.SINGLETON;
    }

    @Override
    public Boolean visitScopeAnnotation(Class<? extends Annotation> scopeAnnotation) {
        System.out.println("\t scope annotation: "+scopeAnnotation);
        return scopeAnnotation == Singleton.class;
    }

    @Override
    public Boolean visitNoScoping() {
        return Boolean.FALSE;
    }
}

出力は次のようになります。

Examing key Key[type=com.google.inject.Injector, annotation=[none]]
Examing key Key[type=java.util.logging.Logger, annotation=[none]]
Examing key Key[type=com.google.inject.Stage, annotation=[none]]
    found eager singleton
    singleton: DEVELOPMENT
Examing key Key[type=UserManager, annotation=[none]]
Examing key Key[type=UserManagerImpl, annotation=[none]]
     scope: Scopes.SINGLETON
    singleton: UserManagerImpl@1935d392
于 2013-03-09T11:48:52.610 に答える