asc*_*erk 2 java inversion-of-control cdi weld
鉴于以下课程
private static class ProducedInSubClass {
}
private static class ProducedInSuperClass {
}
public static class SuperClass {
@Produces
public ProducedInSuperClass producedInSuperClass = new ProducedInSuperClass();
}
public static class SubClass extends SuperClass {
@Produces
ProducedInSubClass producedInSubClass = new ProducedInSubClass();
}
public static class BeanWithSubClass {
@Inject
SubClass subClass;
@Inject
ProducedInSuperClass producedInSuperClass;
@Inject
ProducedInSubClass producedInSubClass;
}
Run Code Online (Sandbox Code Playgroud)
ProducedInSuperClass的注入仍然不满意.这与CDI-Spec第4.2章一致,我知道.
为了使这项工作,我需要扩展SubClass
@Produces
ProducedInSuperClass producedInSuperClassInSubClass = producedInSuperClass;
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释一下吗?为什么Injects,Annotations Interceptors ...继承但不是生产者?
为什么......继承而不是生产者?
bean 子类不继承生产者方法和字段。
如果生产者方法和字段将被继承,那么将存在多个 bean ......有资格注入到CDI 视为不明确依赖的注入点。
另一方面,CDI 支持生产者方法专业化:
@Mock
public class MockShop extends Shop {
@Override @Specializes
@Produces
PaymentProcessor getPaymentProcessor() {
return new MockPaymentProcessor();
}
@Override @Specializes
@Produces
List<Product> getProducts() {
return PRODUCTS;
}
...
}
Run Code Online (Sandbox Code Playgroud)
你有没有理由只操作静态类?生产者需要放在要识别的实际CDI bean上.你的样本是从上下文中撕裂的,所以我不能说它们是否真的被认为是bean.
但是,将样本转移到非静态测试用例(有一些@Vetoed bean和生产者),它将按照您的预期运行 - 两个生产者都可以找到并生成可注射的bean.因此,您可能需要共享一个完整的可重复样本,我们可以从那里开始.
我怀疑你问的继承不是这里的实际问题.
无论如何,它的设计就像CDI 1.0那样,因此找到一个讨论就好了(至少没有JIRA问题,我确实在那里检查过).但是有一个原因立即浮现在脑海中 - 假设生产者的继承已经存在.然后你的上面的场景将有一个生产者ProducedInSuperClassin,SuperClass但由于继承也在SubClass.假设都是合法的注射(没有通过专业化禁用),那么你现在面临一个不明确的依赖例外,因为你有两个生产者相同的bean类型相同的带豆预选赛,因为SuperClass和SubClass是两个不同的豆类,都含有一个制片人.我想说这是禁止生产者继承的公平原因.此外,仍然继承,你可以覆盖子类中的方法,并出现更多的问题 - 你保持两者还是禁用原始的?如果你保留它们,那么新方法的限制是什么?如果您决定使用其中@Vetoed一种豆类,该怎么办?
从我的角度来看,这只是一个设计决定.可能到位以防止进一步混淆.虽然我知道这不是答案,所以你可能正在寻找,质疑如此古老的设计很少有更准确的答案:-)