2016-04-19 7 views
7

Denken Sie, es ist eine gute Idee, alle weithin verwendeten Utility-Methoden in eine Anwendungsbereichs-Bean zu setzen?Utility-Methoden in der Anwendung Scoped Bean

In der aktuellen Implementierung der Anwendung, an der ich arbeite, sind alle Hilfsmethoden (Manipulation mit Strings, Cookies, Überprüfung der URL, Überprüfung der aktuellen Seite, wo der Benutzer usw.) alle in einem großen Anfragebereich Bean und Sie werden von jeder xhtml-Seite referenziert.

Ich konnte keine Informationen über Stackoverflow finden, wenn der Ansatz, Utility-Methoden in eine Beantragungs-Bean zu setzen, eine gute oder eine schlechte Wahl wäre.

Warum ich auf diese Idee stieß, ist die Notwendigkeit der Wiederverwendung dieser Methoden in einem Bean eines breiteren Bereichs als eine Beangabe beanspruchte Bean (wie Ansicht oder Sitzung Bereich Bean). Korrigieren Sie mich, wenn ich falsch liege, aber Sie sollten immer gleiche oder breitere Bohnen injizieren, d. H. Sie sollten keine beanspruchte Bean innerhalb eines View-Bereichs injizieren.

Ich denke, die Verwendung von Utility-Methoden aus der Anwendung scoped Bean sollte vorteilhaft sein (es wird keine neuen Objekt-Kreationen, ein Objekt erstellt und wiederverwendet über die gesamte Anwendung), aber ich möchte noch eine Bestätigung oder jemand um mir zu sagen, ob das falsch ist und warum ist es falsch.

Antwort

8

Wenn der Bean-Bereich keinen Status hat (d. H. Die Klasse hat keine veränderbaren Instanzvariablen), kann er sicher im Anwendungsbereich liegen. Siehe auch How to choose the right bean scope? Dies alles ist unabhängig vom Zweck der Bean (Dienstprogramm oder nicht). Da Utility-Funktionen per Definition zustandslos sind, sollten Sie auf jeden Fall eine Application-Bean verwenden. Es spart die Kosten für die Instanziierung bei jeder einzelnen Anfrage.

Da es in einer verwalteten Bean Hilfsmethoden gibt, ist dies in der objektorientierten Perspektive eine schlechte Übung, da die Methoden static nicht so sein können, wie sie sein sollten. Sie können sie nicht als echte Hilfsmethoden in anderen normalen Java-Klassen verwenden. Statische Code-Analysatoren wie Sonar werden sie alle mit einer großen roten Flagge markieren. Dies ist somit ein Anti-Pattern. Der richtige Ansatz unter Verwendung eines echten Utility-Klasse (public final class mit private Constructor() mit ausschließlich static Methoden) zu halten wäre und registrieren diese alle static Methoden wie EL-Funktionen in your.taglib.xml wie in How to create a custom EL function to invoke a static method?

Mindestens beschrieben, ist es das, was Sie tun sollten, wenn Sie eine öffentlich wiederverwendbare Bibliothek wie JSTL fn:xxx(), PrimeFaces p:xxx() oder OmniFaces of:xxx() haben möchten. Wenn Sie OmniFaces verwenden, können Sie anstelle der Erstellung einer your.taglib.xml-Datei die Klasse in <o:importFunctions> referenzieren. Es exportiert automatisch alle public static Methoden des angegebenen Typs in den EL-Funktionsumfang.

<o:importFunctions type="com.example.Utils" var="u" /> 
... 
<x:foo attr="#{u:foo(bean.property)}" /> 

Wenn Sie nicht OmniFaces verwenden, und das alles ist für den internen Gebrauch, dann kann ich mir vorstellen, dass es ermüdend wird für jede winzige Nutzenfunktion ganze your.taglib.xml Registrierung vorformulierten zu wiederholen, die plötzlich erscheint. Ich kann eine Anwendungsbereichs-Bean für solche Fälle "nur für den internen Gebrauch" rationalisieren und vergeben. Nur wenn Sie anfangen, es zu externalisieren/zu modularisieren/zu publizieren, sollten Sie es wirklich als EL-Funktionen registrieren und schlechte Praktiken nicht in die Öffentlichkeit bringen.

+0

Ich war mir bewusst, dass die Dienstprogramme eigentlich statische Methoden sein sollten, aber ich wusste nicht, dass ich sie als EL-Funktionen verwenden könnte. Danke für Ihre ausführliche Antwort – ontime

+0

Gern geschehen. – BalusC