有些人想知道为什么CDI要求在Bean可以通过EL访问之前必须使用显式的@Named注解?为什么不直接给所有Bean赋予默认名称呢?
原因在于EL只有一个平面命名空间。EL中没有合格名称的概念。JSF社区的实践经验表明,避免重复名称比看起来要难,尤其是在应用程序包含由不同团队维护的多个模块时。记住,并不是所有的CDI Bean都旨在成为用户界面层的一部分。一个Java EE 6应用程序可能包含定义独立业务层的模块,其Bean应该始终通过类型安全的依赖注入来访问,而不是非类型安全的EL名称。这些模块中的Bean应该没有 EL名称,以避免污染UI层的命名空间。
尽管如此,组合@Named @RequestScoped在JSF应用程序中将非常常见。因此,CDI包含一个内置的标注,封装了这些默认值。《a href="http://download.oracle.com/javaee/6/api/javax/enterprise/inject/Model.html" target="" class="regularLink">@Model 标注指的是MVC模式中的《q>M角色。我们建议所有JSF用户界面相关的Bean都使用@Model标注,以节省一些打字(一个标注代替两个),更重要的是,使它们在系统中的架构角色更加清晰。
实际上,即使您有一个非@RequestScoped的UI模型Bean,我也建议您使用@ConversationScoped @Model标注,而不是@Named @ConversationScoped。这两个选项具有相同的功能效果,但第一种组合向后来阅读您代码的人传达了更多信息,并使得快速搜索所有UI模型Bean变得容易。
(当然,如果出于任何原因,您不喜欢@Model,您始终可以定义自己的 stereotypes 来实现类似的目的。CDI 容器不会以任何特殊方式处理@Model。)