我是Java EE中的上下文依赖注入的新手(我在EE 6上),我想请教一下我遇到的问题:

假设您声明此注释:

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Qualifier
public @interface MaxPassengers {}


在不同的类中,我说当使用@MaxPassengers批注时,getMaxPassengers方法产生要注入的值:

public class AirplaneInformation implements Serializable {
    @Produces @MaxPassengers Integer getMaxPassengers() {
        return 250;
    }
}


在第三类中,我将@MaxPassengers注入变量中:

@MaxPassengers
@Inject
private Integer maxPassengers;


所有这一切都很好,但是这里有一个转折点:

如果我想更改签名怎么办
@Produces @MaxPassengers整数getMaxPassengers()

@产生@MaxPassengers整数getMaxPassengers(String planeType)

并根据planeType返回maxPassengers的动态值。

我想知道是否可以这样做,如果可以,如何更改以下注释

@MaxPassengers
@Inject
private Integer maxPassengers;


还提供了planeType参数。

感谢您的帮助,
-丹尼尔

最佳答案

这样做的方法是将planeType作为@NonBinding添加到限定符。然后,您可以将InjectionPoint对象传递给您的方法,并以此方式查找MaxPassengersinjectionPoint.getAnnotated().getAnnotation(MaxPassengers.class);

如果要在运行时进行处理,可以使用Instance对象和AnnotationLiteralMaxPassengers,如下所示:

@Inject @Any
private Instance<Integer> integerInstance;


...

integerInstance.select(new MaxPassengersLiteral("foo")).get();

09-04 13:10