なぜプロデューサーCDIには継承されません

aschoerk:

次のクラスを考えます

    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;
   }

ProducedInSuperClassの注入は不満ままです。CDI-スペック章4.2と一致していることを、私は知っています。

この作品を作るために、私はでサブクラスを拡張する必要があります

 @Produces
 ProducedInSuperClass producedInSuperClassInSubClass = producedInSuperClass;

誰もがそのための説明を与えることができますか?なぜ注入し、注釈インターセプタは...プロデューサーを受け継いれていませんが?

Illya Kysil:

なぜ...継承ではなく、生産されていますか?

以下からの抜粋@ProducesのJavaDocを

プロデューサメソッドやフィールドは、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;
   }

   ...

}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=222329&siteId=1