【问题标题】:Passing parameter while injecting and retrieving using InjectionPoint在使用 InjectionPoint 注入和检索时传递参数
【发布时间】:2015-12-07 06:48:58
【问题描述】:

这与Pass Parameter to Instance of @Inject Bean中提出的问题有关

但我需要一些不同的方法来实现。

为了在注入时传递参数,可以创建一个自定义限定符,如下所示:

@Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface SendInject{
    @Nonbinding
    int value() default 0; // int value will be store here
}

要注入的类需要用@SendInject注解为:

@SendInject
public class Receiver{

   int in;

   private int extractValue(InjectionPoint ip) {
        for (Annotation annotation : ip.getQualifiers()) {
            if (annotation.annotationType().equals(SendInject.class))
                return ((SendInject) annotation).value();
       }
       throw new IllegalStateException("No @Initialized on InjectionPoint");
   }

   @Inject
   public Receiver(InjectionPoint ip) {
        this.in= extractValue(ip);
   }
   ..........
  }

在注入 Receiver 时,所有成员都需要使用自定义限定符 @SendInject 。喜欢:

  public class Sender{

      @Inject
      @SendInject(9)
      Receiver receiver;
   ..................

    }

我不想每次注入 Receiver 时都使用@SendInject,因为它不需要在几个点为我的实现传递参数。有什么方法可以在注入Recevier 时自定义自定义限定符,以便仅在需要传递某些参数时使用?

我尝试这样做,但在部署我的组件时得到Ambiguous dependency error

【问题讨论】:

  • 这里更合适的做法是使用生产者方法并读取生产者方法中的值,为所有依赖项查找适当的值。

标签: java javabeans cdi inject qualifiers


【解决方案1】:

这意味着您想要两种类型的接收器(一种是@SendInject,一种是non-@SendInject)。您应该让 CDI 知道如何创建它们。

例如,您可以使用 producer 方法创建 @SendInjectReceiver 并使用 bean 的构造函数创建 non-@SendInject Receiver:

public class Receiver {

    int in;

    public Receiver() {
    }

    public Receiver(int in) {
        this.in = in;
    }

    private static int extractValue(InjectionPoint ip) {
        for (Annotation annotation : ip.getQualifiers()) {
            if (annotation.annotationType().equals(SendInject.class))
                return ((SendInject) annotation).value();
        }
    }

    @Produces
    @SendInject
    public static Receiver createSendInjectReceiver(InjectionPoint ip) {
        int in = extractValue(ip);
        return new Receiver(in);
    }
}

并像往常一样注入不同的Receiver 类型:

public class Client{
      /************************************
       This receiver is created by constructor
      **************************************/
      @Inject
      Receiver receiver1;

      /************************************
      This receiver is created by producer method  
       **************************************/
      @Inject
      @SendInject(999)
      Receiver receiver2;
}

【讨论】:

    猜你喜欢
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2018-04-30
    相关资源
    最近更新 更多