Дано
public class BeanContainer {
@Produces
Bean bean = new Bean();
}
и его альтернативе:
@Alternative
public class BeanContainerAlt extends BeanContainer {
@Produces
int producerInt = 10;
}
, где Бин
public class Bean {
boolean didPostConstruct = false;
@PostConstruct
public void postConstruct() {
didPostConstruct = true;
}
}
введен в MainClass:
public class MainClass {
@Inject
Bean bean;
@Inject
Integer producedInt;
}
Тогда:
Weld weld = new Weld()
.disableDiscovery()
.addBeanClass(MainClass.class)
.addBeanClass(BeanContainer.class)
.addBeanClass(BeanContainerAlt.class)
.alternatives(BeanContainerAlt.class);
WeldContainer container = weld.initialize();
final MainClass mainClass = container.select(MainClass.class).get();
assertFalse(mainClass.bean.didPostConstruct);
assertEquals(10, (long)mainClass.producedInt);
BeanContainer containerObject = container.select(BeanContainer.class).get();
assertEquals(BeanContainerAlt.class, containerObject.getClass());
не дает ошибок.Я ожидал, что Bean.class нужно будет добавить, используя addBeanClass , чтобы можно было выполнить инъекцию в MainClass .Объяснение состоит в том, что Суперкласс BeanContainerAlt , чьи Производители должны быть неэффективными, производит Боб-объект.Предназначено ли это поведение или даже в соответствии со спецификацией (я не нашел его), возможно, оно определено в документации по сварке?
Исходный код можно найти в examplesrc
mvn clean install -Dtest=ReproProducersInSuperclasses
, в этом проекте он должен запускаться