2012-11-06 2 views
8

Ich weiß, es ist nicht ein bestes Design, sondern nur ein Gedanke von einem Spring-Neuling.Was ist der Schaden, eine STATIC-Methode in Service-Layer - Frühling 3

Jetzt können wir einfach autowire jede Service-Methode bequem im Frühjahr Rahmen. Aber was ist der Nachteil, wenn Sie eine statische Factory-Methode der Serviceklasse erstellen und diese überall aufrufen?

Es ist ziemlich üblich, wie folgen aus:

@Autowired 
CustomerService customerService; 

.... 
AccountDetail ad = customerService.getAccountDetail(accountId, type); 

Dies soll aber auch funktionieren:

AccountDetail ad = CustomerService.getAccountDetail(accountId, type); //if we make getAccountDetail(String, String) static 

Warum also ein Entwurf wie autowire gibt es? Es sieht schick und wirklich cool aus, aber die dahinter stehende Arbeit erzeugt immer noch eine Service-Bean-Instanz auf einem anderen Service-Objekt.

Ernsthaft, während der Frühling über den ganzen Markt ist, so viele Beiträge und Artikel sprechen über Profis & Renovierungen. Aber garantiert es bessere Leistung (wie mit Autowire anstelle von statischen)?

+4

statische Methoden töten Polymorphie, die es schwierig macht, Code zu tauschen/testen/spotten und verhindert Pluggability, die Schlüsselfaktoren von Spring sind –

Antwort

13

Es gibt zahlreiche Gründe:

  • Sie nicht CustomerService mit einem Mock leicht während des Tests ersetzen können (Werkzeuge wie PowerMock beiseite)

  • static Methoden nehmen nicht an Standard-Proxy-basierten AOP (keine Transaktionen, Sicherheit, benutzerdefinierte Aspekte)

  • Sie können nicht mehr fancy Injektionstechniken, wie HTTP-Anfrage (Request Scoped) in Singleton Scoped Services injizieren (Schlechtes Design sowieso, aber ...)

aber vollständig zu sein, es gibt auch Vorteile:

  • static Methode ist eigentlich näher an Ihre Absicht, Frühling Bohnen sind sehr selten Stateful, so dass sie nicht wirklich eine Instanz brauchen

  • static Aufruf funktionieren könnte schneller sein (dies ist irrelevant in 99% der Programme)

4

Was ist, wenn Sie mehrere CustomerService-Komponenten mit unterschiedlicher Konfiguration benötigen? Sie können das nicht mit einer einzigen statischen Methode tun.

Auch, wenn es irgendeine Konfiguration auf CustomerService gibt, wie injizieren Sie es? Eine Bohne, die in abhängige Objekte verdrahtet wird, zentralisiert Ihre Konfiguration und verhindert, dass Sie Ihren Code durchsuchen müssen.