【问题标题】:Injecting commonly used CDI beans in abstract parent class在抽象父类中注入常用的 CDI bean
【发布时间】:2017-04-07 08:17:13
【问题描述】:

这更像是一个很好的练习题...

我们在 JSF 2.2 中将 JSF 托管 bean 转换为 CDI bean。这样做时,似乎在很多 bean 中,我们需要一些 sessionscoped bean。

我们最初打算@Inject 这些,但另一种选择是将它们注入父“FacesBean”类中的受保护变量中。

  1. 这是一种好的做法吗?
  2. @Inject 是否也适用于尚未转换为 CDI 的 @ManagedBean 类?

【问题讨论】:

    标签: jsf cdi jsf-2.2 java-ee-7


    【解决方案1】:

    这么一来:

    1) 好的做法?

    如果您有一个类层次结构,我建议您将其@Inject 放入父级中的 private 字段中,然后创建一个所需可见性最低的 getter 方法(可能是受保护的)。只需遵守 Java 封装的一般良好实践规则即可。

    2) @ManagedBean@Inject?

    只要您使用 bean 发现模式 all(使用空的 beans.xml),您的类将被自动拾取为托管 bean - 包括带有 @ManagedBean 注释的那些。一旦它是一个 bean,注入就起作用了。所以是的,只要类可以自动成为 bean,注入就会起作用(例如,它不是 @Vetoed 或不可代理等)

    【讨论】:

    • 问题是,使用 getter 声明一个私有注入变量,为开发人员在子类中再次注入相同变量打开了大门。然后我们注射两次吗?
    • 好吧,我不明白注入受保护字段如何防止开发人员犯完全相同的错误 - 但如果你觉得它更好,那就去做吧,它应该可以工作。要回答上面的问题,您将有两个注入点,因此是的,您将注入两次(但除非它是 @Dependent,否则您实际上只会注入一个指向 bean 的相同底层实例的代理对象).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    相关资源
    最近更新 更多