public ProducerInjector(final MetaClass injectedType,
final MetaClassMember producerMember,
final InjectableInstance producerInjectableInstance) {
final InjectionContext injectionContext = producerInjectableInstance.getInjectionContext();
switch (producerInjectableInstance.getTaskType()) {
case PrivateField:
case PrivateMethod:
producerInjectableInstance.ensureMemberExposed(PrivateAccessType.Read);
}
super.qualifyingMetadata = producerInjectableInstance.getQualifyingMetadata();
this.provider = true;
this.injectedType = injectedType;
this.enclosingType = producerMember.getDeclaringClass();
this.producerMember = producerMember;
this.producerInjectableInstance = producerInjectableInstance;
this.singleton = injectionContext.isElementType(WiringElementType.SingletonBean, getProducerMember());
this.disposerMethod = findDisposerMethod(injectionContext.getProcessingContext());
this.creationalCallbackVarName = InjectUtil.getNewInjectorName().concat("_")
.concat(injectedType.getName().concat("_creational"));
final Set<Annotation> qualifiers = new HashSet<Annotation>();
qualifiers.addAll(InjectUtil.getQualifiersFromAnnotations(producerMember.getAnnotations()));
if (qualifiers.isEmpty()) {
qualifiers.add(BuiltInQualifiers.DEFAULT_INSTANCE);
}
qualifiers.add(BuiltInQualifiers.ANY_INSTANCE);
qualifyingMetadata = injectionContext.getProcessingContext().getQualifyingMetadataFactory()
.createFrom(qualifiers.toArray(new Annotation[qualifiers.size()]));
if (producerMember.isAnnotationPresent(Specializes.class)) {
makeSpecialized(injectionContext);
}
if (producerMember.isAnnotationPresent(Named.class)) {
final Named namedAnnotation = producerMember.getAnnotation(Named.class);
this.beanName = namedAnnotation.value().equals("")
? ReflectionUtil.getPropertyFromAccessor(producerMember.getName()) : namedAnnotation.value();
}
injectionContext.addInjectorRegistrationListener(producerMember.getDeclaringClass(),
new InjectorRegistrationListener() {
@Override
public void onRegister(final MetaClass type, final Injector injector) {
injector.addDisablingHook(new Runnable() {
@Override
public void run() {
setEnabled(false);
}
});
}
});
injectionContext.addInjectorRegistrationListener(injectedType,
new InjectorRegistrationListener() {
@Override
public void onRegister(final MetaClass type, Injector injector) {
while (injector instanceof QualifiedTypeInjectorDelegate) {
injector = ((QualifiedTypeInjectorDelegate) injector).getDelegate();
}
if (!(injector instanceof ProducerInjector)) {
injector.setEnabled(false);
}
}
});
if (producerMember instanceof MetaMethod && injectionContext.isOverridden((MetaMethod) producerMember)) {
setEnabled(false);
}
if (injectionContext.isInjectorRegistered(enclosingType, qualifyingMetadata)) {
setRendered(true);
}
else {
injectionContext.getProcessingContext().registerTypeDiscoveryListener(new TypeDiscoveryListener() {
@Override
public void onDiscovery(final IOCProcessingContext context,
final InjectionPoint injectionPoint,
final MetaClass injectedType) {
if (injectionPoint.getEnclosingType().equals(enclosingType)) {