2016-04-19 4 views
7

広く使用されているすべてのユーティリティメソッドをアプリケーションスコープBeanに入れることをお勧めしますか?アプリケーションスコープ付きBeanのユーティリティメソッド

私が取り組んでいるアプリケーションの現在の実装では、すべてのユーティリティメソッド(Strings、Cookie、URLのチェック、ユーザの現在のページのチェックなど)はすべて1つの大きなリクエストスコープのBeanに入れられます。それらはすべてのxhtmlページから参照されます。

アプリケーションスコープのBeanにユーティリティメソッドを配置するアプローチが良いか悪い選択になるかは、stackoverflowに関する情報が見つかりませんでした。

私がこのアイデアに遭遇したのは、リクエストスコープのBean(ビューまたはセッションスコープBeanなど)よりも広いスコープのBeanでこれらのメソッドを再利用する必要があるからです。私が間違っている場合は私を修正しますが、常に同じまたはより広いスコープのBeanを注入する必要があります。つまり、リクエストスコープのBeanをビュースコープ内に挿入しないでください。

私はアプリケーションスコープ付きBeanからのユーティリティメソッドを使用すると有益なはずだと思います(新しいオブジェクトの作成はありません.1つのオブジェクトが作成され、すべてのアプリケーションで再利用されます)。それが間違ったアプローチであり、なぜそれが間違っているのかを教えてください。

答えて

8

Beanのスコープに関しては、Beanに状態がない場合(つまり、クラスにインスタンス変数がありません)、アプリケーションスコープにすることができます。参照How to choose the right bean scope?これはすべて、Beanの目的(ユーティリティかどうか)に関係なくです。ユーティリティ関数が定義ごとにステートレスであることを考えれば、アプリケーションスコープのBeanを使用しているはずです。単一のリクエストごとにインスタンス化のコストを節約できます。

マネージドBeanにユーティリティメソッドを持たせることについては、オブジェクト指向の観点からはELからアクセスするためには、それらのメソッドをstaticにする必要がありません。他の通常のJavaクラスでは、それらを実用的なユーティリティメソッドとして使用することはできません。ソナーのような静的なコードアナライザーは、大きな赤い旗でそれらをすべてマークします。これはアンチパターンです。正しいアプローチは真のユーティリティクラス(のみstatic方法とprivate Constructor()public final class)を使用し続けると、少なくともHow to create a custom EL function to invoke a static method?

で説明したようにyour.taglib.xmlにEL関数としてこれらすべてのstaticメソッドを登録することです、これはあなたがやるべきものです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関数として実際に登録し、貧しい慣習を一般に公開するべきではありません。

+0

ユーティリティは実際には静的メソッドでなければならないと知っていましたが、私はそれらをEL関数として使用できることに気づいていませんでした。あなたの詳細な回答ありがとう – ontime

+0

ようこそ。 – BalusC

関連する問題