代码之家  ›  专栏  ›  技术社区  ›  Paul Samsotha

什么时候应该明确命名托管Bean?

  •  4
  • Paul Samsotha  · 技术社区  · 11 年前

    在我对创建托管bean所做的所有研究中,我没有注意到(或者我可能忽略了)什么时候使用bean的显式命名。 @Named(name = "someBean") .

    我想我很难理解的是,为什么要给bean命名类名以外的任何名称:

    @Named(name = "someBean")
    public class SomeBean implements Serializebale {
    }
    

    在我看到的所有例子中,有些使用了显式名称,有些只使用 @Named 以保留默认类名。这些例子都没有解释他们为什么使用显式命名。尝试使用类名以外的任何东西访问bean似乎更令人困惑。

    所以我想问题是,对于什么时候你想提供一个不同于类名的访问名,或者人们只是在有一个长类名的情况下这样做,他们希望能够用更少的键入来访问,有什么经验法则或惯例吗?

    1 回复  |  直到 11 年前
        1
  •  6
  •   Community Vlad V    4 年前

    您的问题涉及 Convention over configuration 设计范式。为了解决过去的错误,其中包括广泛配置的必要性,自许多Java框架/API等的上一次发布以来,已经引入了许多默认值。在这种情况下,JSF/CDI也不例外。

    例如,用注释bean就足够了 @ManagedBean 顺其自然 @RequestScoped 并通过以下方式使其在EL范围内可用 simpleClassName :

    name()属性的值被视为托管bean名称。如果name属性的值未指定或为空String,则托管bean名称是通过获取完全限定类名的非限定类名部分并将第一个字符转换为小写而派生的。例如,如果ManagedBean注释位于具有完全限定类名com.example.Bean的类上,并且注释上没有name属性,则托管Bean名称将被视为Bean。此注释所附加的类的完全限定类名被视为托管bean类。

    托管bean的作用域是使用NoneScoped、RequestScoped、ViewSco佩德、SessionScoped,ApplicationScoped或CustomScoped注释之一声明的。如果省略了作用域注释,则必须像存在RequestScoped注释一样处理bean。

    这同样适用于CDI-beans、EJB、JPA-Entity类等。因此,我看到的唯一原因是 @ManagedBean(name = "myBean") public class MyBean 是为您自己或未经验丰富的受众显式地重复生成的托管bean的名称。

    同样值得注意的是,有时开发人员倾向于不以其类的简单名称命名bean,而是引用一些显式的简短自我解释的名称,如下面的行: @ManagedBean(name = "settings") public class UserDefinedSettingsBean .