gpt4 book ai didi

java - 使用 InjectionPoint 在注入(inject)和检索时传递参数

转载 作者:行者123 更新时间:2023-11-30 03:08:42 24 4
gpt4 key购买 nike

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

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

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

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

需要注入(inject)的类需要用@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);
}
..........
}

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

  public class Sender{

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

}

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

我尝试这样做,但在部署组件时出现不明确的依赖项错误

最佳答案

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

例如,您可以使用生产者方法创建@SendInject接收器并使用bean的构造函数创建非@SendInject接收器:

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

并像往常一样注入(inject)不同的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;
}

关于java - 使用 InjectionPoint 在注入(inject)和检索时传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34127931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com