ont*_*ime 8 jsf jsf-2.2 application-scope
您认为将所有广泛使用的实用程序方法放在应用程序范围的bean中是一个好主意吗?
在当前执行的应用程序我的工作,所有的实用方法(用绳子,饼干操纵,检查URL,检查当前的页面,用户等)都放在一个大的请求范围豆,他们是从引用每个xhtml页面.
如果将实用程序方法放在应用程序作用域中的方法是一个好的或坏的选择,我找不到有关stackoverflow的任何信息.
为什么我遇到这个想法是需要在范围更广的bean中重用那些方法,然后再使用请求范围的bean(如视图或会话范围的bean).如果我错了,请纠正我但是你应该总是注入相同或更宽的范围bean,即你不应该在视图范围内注入请求范围的bean.
我想使用的实用方法,从应用范围的bean应该是有益的(不会有任何新对象的创建,一个对象将被创建并在所有应用重复使用),但我仍然想确认或如果有人告诉我这是一种错误的方法,为什么是错的.
Bal*_*usC 11
至于bean范围,如果bean没有任何状态(即类没有任何可变的实例变量),那么它可以安全地应用于作用域.另请参见如何选择正确的bean范围?这一切都与bean的目的无关(实用与否).鉴于实用程序函数是按定义无状态的,那么您肯定应该使用应用程序作用域bean.它节省了在每个请求上实例化的成本.
至于在托管bean中使用实用程序方法,从面向对象的角度来看,这是一种不好的做法,因为为了从EL访问它们,这些方法不static
应该是它们应该的.您不能将它们用作其他普通Java类中的实用方法.像Sonar这样的静态代码分析器会用大红旗标记它们.因此,这是一种反模式.正确的方法是使用一个真正的实用类(保持public final class
与private Constructor()
具有单独static
的方法)并注册所有这些static
的方法作为EL函数your.taglib.xml
在描述如何创建自定义EL函数来调用一个静态方法?
至少,当您打算拥有一个可公开重用的库(如JSTLfn:xxx()
,PrimeFacesp:xxx()
或OmniFaces)of:xxx()
时,您应该这样做.如果您碰巧使用OmniFaces,那么您可以,而不是创建your.taglib.xml
文件,引用该类<o:importFunctions>
.它会自动public static
将给定类型的所有方法导出到EL函数范围.
<o:importFunctions type="com.example.Utils" var="u" />
...
<x:foo attr="#{u:foo(bean.property)}" />
Run Code Online (Sandbox Code Playgroud)
如果你不使用OmniFaces,并且这一切都是供内部使用的,那么我可以想象,your.taglib.xml
为每个突然弹出的小实用功能重做所有注册样板都变得很烦人.我可以合理化和原谅滥用应用程序范围的bean用于这种"仅限内部使用"的情况.只有当你开始外化/模块化/公开它时,你才应该将它们注册为EL功能,而不是将不良做法公开.