2017-03-15 3 views
1

Ich versuche Nachteile von meinem Design zu verstehen, unten ist mein CodeFrühling Bean für statische Klassen

class Utils { 
    public static SpringBean bean; 
    public static void setBean(SpringBean b){ 
     bean = b; 
    } 
    public static SpringBean getBean(){ 
     return bean; 
    } 
    public static Object getSomethingFromBean(){ 
     return bean.getSomethingFromBean(); 
    } 
} 

Unten ist mein bean Kontext xml

<bean id="utils" class="utils"> 
    <property name="bean" ref="springBean"></property> 
</bean> 

<bean id="springBean" class="SpringBean"> 
</bean> 

ich das so mache ich kann direkt Aufruf Methoden der utils Klasse wie,

+0

Warum möchten Sie das? Was ist der Anwendungsfall? In Ihrem Beispiel _'utils.getSomethingFromBean() '_ rufen Sie eine' statische Methode für eine Instanz von 'Utils' auf - warum muss die Methode überhaupt" statisch "sein? –

+0

Es gibt keinen besonderen Anwendungsfall, nur um die Nachteile zu verstehen. Auch ich habe die Utils zu Utils geändert. – freshflesh

+0

Ein Wort, das wichtigste Wort, das Sie jemals hören werden, wenn es darum geht, modernes Java zu schreiben - ** Testability **. –

Antwort

4

Der Punkt des Frühlings ist (hier zu vereinfachen), um den Zugang zu den Diensten thro zu vermeiden ugh statische Methoden oder Singletons. Alle Gründe für die Verwendung von Spring beziehen sich darauf, warum dieser Ansatz nicht verwendet wird.

Auch die Instantiierung einer statischen-fields-only-Klasse ist ein guter Hinweis darauf, dass Sie etwas Ungewöhnliches tun.

Und zuletzt, wie dargestellt, macht es keinen Sinn, den Inhalt von Utils statisch zu haben - Sie können utils.getSomethingFromBean(); genauso gut tun, wenn Utils eine normale Bohne ohne statische Felder ist. Wenn Sie in der Lage sein möchten, Utils.getSomethingFromBean(); aufzurufen, sollten Sie dem Aufrufer utils Spring Bean zur Verfügung stellen, anstatt auf statische Methoden zurückgreifen zu müssen.

+0

Ich habe beim Schreiben einen Fehler gemacht ... ich bin nicht instanziiert die Klasse. es ist Utils.getSomethingFromBean(); – freshflesh

+0

Sie sind in der Tat instanziieren es, oder genauer, Spring ist. Ihr XML weist Spring an, eine Instanz von 'Utils' zu erstellen, nur um dann eine Methode aufzurufen, die in das statische Feld schreibt. –