Java 如何注入实现同一接口的两个不同类的两个实例?

Java 如何注入实现同一接口的两个不同类的两个实例?,java,cdi,Java,Cdi,在java中处理CDI时,我希望注入两个不同类的两个实例,实现相同的接口 据我所知,我可以注入不实现接口的类的实例,例如: class MyClass { // ... } class XY { @Inject MyClass myClass; } 当我的类实现接口时,我必须通过接口名称声明成员(并指定具体实现): 但是,只要我想注入不同的实现,我就会得到“Api类型[…]未找到带有限定符”异常: class MyClassOne implements MyInterface {

在java中处理CDI时,我希望注入两个不同类的两个实例,实现相同的接口

据我所知,我可以注入不实现接口的类的实例,例如:

class MyClass {
  // ...
}

class XY {
  @Inject MyClass myClass;
}
当我的类实现接口时,我必须通过接口名称声明成员(并指定具体实现):

但是,只要我想注入不同的实现,我就会得到“Api类型[…]未找到带有限定符”异常:

class MyClassOne implements MyInterface {
  // ...
}

class MyClassTwo implements MyInterface {
  // ...
}

class XY {
  @Inject MyClassOne myClassOne;
  @Inject MyClassTwo myClassTwo;
}
我很欣赏任何关于尝试什么或在哪里继续阅读的想法(搜索这个主题的明显关键词会给出非常不具体的结果)。
提前谢谢

为了注入不同的实例,有不同的方法来构造和注入bean

方法1

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface ClassifierOne {
}

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface ClassifierTwo {
}
这些限定符可以在类的构造参数注入部分或setter注入级别中使用

@ClassifierOne
public class MyClassOne implements MyInterface {
  // ...
}

@ClassifierTwo
public class MyClassTwo implements MyInterface {
 // ...
}

public class XY {
   private final MyInterface myClassOne;
   private final MyInterface myClassTwo;

   @Inject
   public XY ( @ClassifierOne MyInterface myClassOne, @ClassifierTwo MyInterface myClassTwo ) {
         this.myClassOne = myClassOne;
         this.myClassTwo = myClassTwo;
   }
}
方法2:使用@products

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface MyClassType {
    ClassImplName value();
}

public enum ClassImplName {
    CLASS_ONE(MyClassOne.class),
    CLASS_TWO(MyClassTwo.class);

    private Class<? extends MyInterface> classType;

    private ClassImplName(Class<? extends MyInterface> clazz) {
        this.classType = clazz;
    }

    public Class<? extends MyInterface> getClassType(){
        return classType;
    }
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
public @interface ClassType {
    ClassImplName value();
}

为了注入不同的实例,有不同的方法来构造和注入bean

方法1

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface ClassifierOne {
}

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface ClassifierTwo {
}
这些限定符可以在类的构造参数注入部分或setter注入级别中使用

@ClassifierOne
public class MyClassOne implements MyInterface {
  // ...
}

@ClassifierTwo
public class MyClassTwo implements MyInterface {
 // ...
}

public class XY {
   private final MyInterface myClassOne;
   private final MyInterface myClassTwo;

   @Inject
   public XY ( @ClassifierOne MyInterface myClassOne, @ClassifierTwo MyInterface myClassTwo ) {
         this.myClassOne = myClassOne;
         this.myClassTwo = myClassTwo;
   }
}
方法2:使用@products

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface MyClassType {
    ClassImplName value();
}

public enum ClassImplName {
    CLASS_ONE(MyClassOne.class),
    CLASS_TWO(MyClassTwo.class);

    private Class<? extends MyInterface> classType;

    private ClassImplName(Class<? extends MyInterface> clazz) {
        this.classType = clazz;
    }

    public Class<? extends MyInterface> getClassType(){
        return classType;
    }
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
public @interface ClassType {
    ClassImplName value();
}

谢谢!这帮了大忙。这也让我想到了第三种可能更简单的方法——为我的每个类引入另一个接口,然后扩展
MyInterface
接口。非常感谢!这帮了大忙。这也让我想到了第三种可能更简单的方法——为我的每个类引入另一个接口,然后扩展
MyInterface
接口。