【问题标题】:Context Dependency Inhections in Java EEJava EE 中的上下文依赖注入
【发布时间】:2014-10-05 00:48:38
【问题描述】:

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

假设你声明了这个注解:

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

在另一个类中,我说 getMaxPassengers 方法会在使用 @MaxPassengers 注释时产生要注入的值:

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

在第三节课中,我将@MaxPassengers 注入到一个变量中:

@MaxPassengers
@Inject
private Integer maxPassengers;

所有这些工作都很棒,但这里有一个转折点:

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

并根据planeType返回ma​​xPassengers的动态值。

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

@MaxPassengers
@Inject
private Integer maxPassengers;

还提供 planeType 参数。

感谢您的帮助, -丹尼尔

【问题讨论】:

    标签: java jakarta-ee cdi


    【解决方案1】:

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

    如果您想在运行时启动它,您可以使用 Instance 对象和 AnnotationLiteralMaxPassengers,如下所示:

    @Inject @Any
    private Instance<Integer> integerInstance;
    
    
    ...
    
    integerInstance.select(new MaxPassengersLiteral("foo")).get();
    

    【讨论】:

    • 出于好奇:@Any 是必需的,还是仅注入 @MaxPassengers 可以加快速度?
    • Any 是必需的,因为注入点不知道要注入什么。
    • 感谢约翰的回答。我的感觉是,您是真正的 Java EE 专家。老实说,在我完全理解你的意思之前,我必须学习更多的 CDI。我从“Java EE 6 教程基本概念”一书中学到了有关 CDI 的所有知识,然后提出了航空公司小型概念验证项目。本周我将阅读“EJB 3 入门”中的 CDI 章节,然后希望我能了解更多...
    猜你喜欢
    • 2014-11-23
    • 2012-11-11
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多