gpt4 book ai didi

jsf - 应用程序范围 bean 中的实用方法

转载 作者:行者123 更新时间:2023-12-04 06:16:33 25 4
gpt4 key购买 nike

您认为将所有广泛使用的实用程序方法放在应用程序范围的 bean 中是个好主意吗?

在我正在处理的应用程序的当前实现中,所有实用程序方法(使用字符串、cookie 操作、检查 url、检查用户所在的当前页面等)都放在一个大请求范围的 bean 中,并且引用自每个 xhtml 页面。

如果将实用程序方法放在应用程序范围的 bean 中的方法是好还是坏的选择,我找不到有关 stackoverflow 的任何信息。

为什么我遇到这个想法是需要在更广泛的 bean 中重用这些方法,然后是请求范围的 bean(如 View 或 session 范围的 bean)。如果我错了,请纠正我,但您应该始终注入(inject)相同或更宽范围的 bean,即您不应该在 View 范围内注入(inject)请求范围 bean。

我认为使用应用程序范围 bean 中的实用程序方法应该是有益的(不会有任何新的对象创建,将创建一个对象并在所有应用程序中重复使用),但我仍然希望确认或有人告诉我是否这是一种错误的方法,为什么它是错误的。

最佳答案

至于 bean 范围,如果 bean 没有任何状态(即该类没有任何可变实例变量),那么它可以安全地成为应用程序范围。另见 How to choose the right bean scope?这一切都与 bean 的用途无关(实用程序与否)。鉴于实用程序函数根据定义是无状态的,那么您绝对应该使用应用程序范围的 bean。它节省了对每个请求进行实例化的成本。

至于在托管 bean 中具有实用程序方法,从面向对象的角度来看,这是一种不好的做法,因为为了从 EL 访问它们,这些方法不能是 static虽然他们应该是。您不能将它们用作其他普通 Java 类中的真正实用方法。像 Sonar 这样的静态代码分析器会用一个大红旗标记它们。因此,这是一种反模式。正确的方法是继续使用真正的实用程序类(public final classprivate Constructor() 仅使用 static 方法)并注册所有这些 static your.taglib.xml 中作为 EL 函数的方法如 How to create a custom EL function to invoke a static method? 中所述

至少,当您打算拥有一个可公开重用的库(例如 JSTL fn:xxx() )时,您应该这样做。 , PrimeFaces p: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)}" />

如果你不使用 OmniFaces,而这一切都是为了内部使用,那么我可以想象重做所有这些会变得很累 your.taglib.xml每个突然弹出的微小实用功能的注册样板。对于这种“仅限内部使用”的情况,我可以合理化并原谅滥用应用程序范围的 bean。只有当您开始将其外部化/模块化/公开时,您才应该真正将它们注册为 EL 函数,而不是将不良实践公开。

关于jsf - 应用程序范围 bean 中的实用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36718276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com