【问题标题】:Annotations vs managed beans declarations in faces-config.xmlfaces-config.xml 中的注释与托管 bean 声明
【发布时间】:2011-07-01 11:17:42
【问题描述】:

我正在使用 JSF 2.0,并且对基于新注释的自动装配(在 faces-config.xml 中没有任何代码的托管 bean 的声明)有一定的疑问。

就我而言,注解很好也很容易,但问题可能是在一个大系统中需要用另一个 bean 替换一个 bean,如果使用了注解,将导致需要删除某些类(或类似的脏黑客),虽然它可以很容易地在 faces-cofig.xml 中修复。

请分享您在这件事上的经验。什么应该被认为更方便?为什么?

【问题讨论】:

    标签: java jsf annotations jsf-2


    【解决方案1】:

    但问题可能会出现在一个大系统中,需要用另一种 bean 替换一个 bean

    根本不应该这样做。 JSF 托管 bean 应该特定于 JSF 视图,并且不能被其他层/API 重用。如果您想在 JSF 和不了解 JSF 的其他层/API 之间共享一些数据,那么您应该将这些数据放在它自己的类中,并使其成为 JSF 托管 bean 的属性。

    所以,而不是

    @ManagedBean
    @SessionScoped
    public class User {
        private Long id;
        private String username;
        private String password;
        // ...
    }
    

    你应该有

    @ManagedBean
    @SessionScoped
    public class UserManager {
        private User user;
        // ...
    }
    

    public class User {
        private Long id;
        private String username;
        private String password;
        // ...
    }
    

    这样您就可以在所有层之间共享User,而不必担心特定于层的 API。这也称为“数据传输对象”架构模式。

    【讨论】:

    • 非常感谢您的回答!您是否在此处暗示注释是首选方式,或者只是两者都是同样好的方法,即使对于最复杂的场景也是如此?我有点喜欢注解,但想尽可能避免切换
    • 我应该更具体一点:复杂是指应用程序本身中的复杂数据流(不包括特定于部署的设置),尽可能复杂而无需使用 xml 覆盖注释
    • 使用注释。也就是说,我想确保您知道 javax.faces.bean.* 注释自 JSF 2.3 以来已被弃用。另见stackoverflow.com/q/4347374
    • 再次感谢您的宝贵建议,并请注意!是的,Oracle 的 EE7 教程已经采用了 CDI 的方式,但我会对此感到厌倦。此外,在16.3 中,他们给出了在人脸流上下文中进行注释的进一步原因:他们将代码放置在更靠近流代码的其余部分的位置,并使您能够模块化流,我认为这是一个大专业人士
    • Java EE 8 已经发布了不到 2 个月:javaee.github.io/tutorial/toc.html
    【解决方案2】:

    正如Core JavaServer Faces (Third Edition)中所说:

    在 JSF 2.0 之前,所有 bean 都必须使用 XML 进行配置。如今,你有 注释和 XML 配置之间的选择。 XML配置相当 详细,但如果您想在部署时配置 bean,它会很有用。

    注释允许快速开发并减少冗余的 xml 编码。一般来说,很大程度上取决于项目本身。

    【讨论】:

      猜你喜欢
      • 2016-05-24
      • 1970-01-01
      • 2011-12-17
      • 2012-02-22
      • 2016-11-12
      • 2011-11-23
      • 1970-01-01
      • 2018-04-10
      • 2012-09-26
      相关资源
      最近更新 更多