대신이 바인딩을 사용해야합니다
는
bind(UserManagerImpl.class).in(Singleton.class);
bind(UserManager.class).to(UserManagerImpl.class);
이 돌봐 UserManagerImpl
진짜 싱글이 아닌 인터페이스입니다. 모두
injector.getInstance(UserManager.class);
injector.getInstance(UserManagerImpl.class);
를 호출 그 방법은 동일한 인스턴스가 발생합니다. 을 모두 반복하여 바인딩을 호출하고 getInstance
을 호출하면 나중에 - Singleton
으로 표시되지 않았고 몇 가지 인스턴스가 있습니다.
그래서 ....
그러나 당신은 여전히 인해 다른 이유로 모든 싱글을 얻을해야하는 경우 :
:
이
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;
}
}
출력이 같은 것입니다 :이 같은 BindingScopingVisitor
를 사용하여
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: [email protected]