break;
default:
throw new RuntimeException("illegal producer type");
}
final Injector producerInjector = injectionContext.getInjectorFactory()
.getProducerInjector(injectedType, producerMember, instance);
injectionContext.registerInjector(producerInjector);
if (!producerMember.isStatic()) {
// if this is a static producer, it does not have a dependency on its parent bean
injectionContext.getGraphBuilder()
.addDependency(injectedType, Dependency.on(instance.getEnclosingType()));
}
}
@Override
public boolean handle(final InjectableInstance instance,
final Annotation annotation,
final IOCProcessingContext context) {
final List<Injector> injectors
= injectionContext.getInjectors(instance.getElementTypeOrMethodReturnType());
for (final Injector injector : injectors) {
if (injector.isEnabled()) {
injector.renderProvider(instance);
}
}
return true;
}
}, Rule.after(injectionContext.getAnnotationsForElementType(WiringElementType.SingletonBean),
injectionContext.getAnnotationsForElementType(WiringElementType.DependentBean)));
break;
case DependentBean:
registerHandler(entry.getValue(), new JSR330AnnotationHandler() {
@Override
public boolean handle(final InjectableInstance instance,
final Annotation annotation,
final IOCProcessingContext context) {
final List<Injector> injectors
= new ArrayList<Injector>(injectionContext.getInjectors(instance.getEnclosingType()));
final Injector injector;
final Iterator<Injector> injectorIterator = injectors.iterator();
boolean removed = false;
while (injectorIterator.hasNext()) {
if (!injectorIterator.next().isEnabled()) {
injectorIterator.remove();
removed = true;
}
}
if (injectors.isEmpty() && removed) {
return true;
}
if (injectors.size() == 1) {
injector = injectors.get(0);
}
else {
injector = injectionContext.getInjectorFactory()
.getTypeInjector(instance.getEnclosingType(), injectionContext);
}
if (injector.isEnabled() && injector.isRegularTypeInjector()) {
injector.renderProvider(instance);
}
return true;
}
});
break;
case SingletonBean:
registerHandler(entry.getValue(), new JSR330AnnotationHandler() {
@Override
public boolean handle(final InjectableInstance instance,
final Annotation annotation,
final IOCProcessingContext context) {
final Injector injector = injectionContext.getInjector(instance.getEnclosingType());
if (injector.isEnabled()) {
injector.renderProvider(instance);
}
return true;
}
});
break;