你什么时候应该明确命名一个Managed Bean?

Pau*_*tha 4 jsf java-ee cdi managed-bean

通过我在创建托管bean方面所做的所有研究,我没有注意到(或者我可能忽略的)是何时使用bean的显式命名,例如@Named(name = "someBean").

我想我很难理解为什么你想要将bean命名为除了你的类名之外的其他东西:

@Named(name = "someBean")
public class SomeBean implements Serializebale {
}
Run Code Online (Sandbox Code Playgroud)

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

所以我想问题是,是否有任何经验法则或约定何时你想要提供一个与你的班级名称不同的访问名称,或者如果他们有一个他们希望能够拥有的长类名,人们就会这样做打字少打字?

sku*_*sel 5

您的问题涉及公约而不是配置设计范例.为了应对过去的错误,其中包括广泛配置的必要性,自许多Java框架/ API等的最新版本以来已经引入了许多默认值.在这种情况下,JSF/CDI也不例外.

例如,它足以诠释一个bean @ManagedBean来让它@RequestScoped,让它在EL范围由可用simpleClassName:

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

托管bean的范围使用NoneScoped,RequestScoped,ViewScoped,SessionScoped,ApplicationScoped或CustomScoped注释之一声明.如果省略范围注释,则必须处理bean,就像存在RequestScoped注释一样.

这同样适用于CDI bean,EJB,JPA实体类等.因此,我看到放置该类型行的唯一原因@ManagedBean(name = "myBean") public class MyBean是为自己或无经验的受众显式重复生成的托管bean名称.

值得注意的是,开发人员不时会在其类的简单名称之后命名bean,而是引用一些明确的简短自解释名称,如下所示:@ManagedBean(name = "settings") public class UserDefinedSettingsBean.