Details
-
Bug
-
Resolution: Done
-
Blocker
-
1.1.PFD
-
None
-
Release Notes
Description
CDI-268 introduces a set of factories to deal with the chicken-egg problem when creating Beans and Producers/InjectionTargets.
Unlike InjectionTargetFactory, the ProducerFactory interface does not address the problem properly.
In order to create a Producer implementation for a producer field/method, the following ingredients are needed:
- an AnnotatedField / AnnotatedMethod
- a declaring bean (bean for the class the producer field/method is declared on - the field/method is invoked on instances of the declaring bean) . Declaring bean does not need to be specified if the field/method is static
- bean for which the producer is created - this is needed in order for Producer.getInjectionPoints.getBean() to return the right thing. The bean is optional an may not be specified if the Producer is created for a non-contextual object
The following (slightly modified) SPI should handle all the requirements:
public interface ProducerFactory<X> { public <T> Producer<T> createProducer(Bean<T> bean); }
public interface BeanManager { public <X> ProducerFactory<X> getProducerFactory(AnnotatedField<? super X> field, Bean<X> declaringBean); public <X> ProducerFactory<X> getProducerFactory(AnnotatedMethod<? super X> method, Bean<X> declaringBean); public <T, X> Bean<T> createBean(BeanAttributes<T> attributes, Class<X> beanClass, ProducerFactory<X> producerFactory); }
Notice the additional declaringBean parameter for getProducerFactory() and modified type parameters in createBean() and ProducerFactory.