2017-11-07 1 views
0

Ich möchte von XML-basierten Frühjahr-Konfiguration in Java-basierte wechseln. Für Konstruktor-Injektion ist es einfach. Beispiel verwende ich:Sping Abhängigkeitsinjektion über Setter-Methode und Konfigurationsklasse

@Configuration 
public class BeanConfiguration { 

    @Bean 
    public GreetingService greetingService(GreetingDao greetingDao) { 
     return new GreetingService(greetingDao); 
    } 

    @Bean 
    public GreetingDao greetingDao() { 
     return new GreetingDao(); 
    } 
} 

Allerdings, wenn ich durch Setter-Methode injizieren möchte ich so etwas wie dies tue:

@Configuration 
public class BeanConfiguration { 

    @Bean 
    public MeetingDao meetingDao() { 
     return new MeetingDao(); 
    } 

    @Bean 
    public MeetingService meetingService(MeetingDao meetingDao) { 
     MeetingService meetingService = new MeetingService(); 
     meetingService.setMeetingDao(meetingDao); 
     return meetingService; 
    } 

} 

Ich bin nicht sicher, ob dies eine mögliche Art und Weise mit Java zu injizieren ist -basierte Konfiguration und Setter-Methode. Leider kann ich kein Beispiel finden (für Konstruktorabhängigkeiten existieren viele Beispiele). Auch bin ich mir bei einer Java-basierten Konfiguration nicht sicher, wann ich Konstruktor und wann Setzer verwenden soll. In Spring-Dokumentation wird beschrieben, dass ich Konstruktor für erforderliche und Setter für optionale Abhängigkeit verwenden sollte. Ich sehe es jedoch als das gleiche Ergebnis für diese Art von Ansatz. Danke für jede Klärung.

Adam

Antwort

0

Unter der Annahme, dass Sie nicht die Klassen selbst ändern können, können Sie immer zurückkehren einfach nicht die Bohne, bis Sie alle Werte gespritzt haben.

Konstruktorinjektion ist immer mit Klassenabhängigkeiten bevorzugt, aber nicht immer möglich. Wenn Sie Zugriff auf das Ändern der Quelle für diese Dienste und Beans haben, die Sie erstellen, schlage ich vor, die Konstruktorinjektion zu verwenden und "@Service" für die Klasse und "@Autowired" für die Konstruktoren zu platzieren.

Eigenschaften sind ein Beispiel für "optionale" Abhängigkeiten; Es ist üblich, Standardwerte und Verhalten, wenn nicht zur Verfügung gestellt. Ich bevorzuge es, den "@Value" direkt auf dieses Feld zu setzen, anstatt auf meinen Konstruktor, denn sonst könnten Sie zu viele Parameter haben. Dies ist "Setter" -Injektion, aber Sie wollen keine tatsächliche Setter-Methode (wieder, normalerweise sowieso nicht); Sie möchten nur, dass Spring den Wert ändert, nicht Ihren anderen Code.

Die Verwendung von "@Value" ist in Ordnung, wenn Sie nur ein oder zwei Eigenschaften (oder 3? Es ist keine exakte Wissenschaft); Wenn Sie jedoch feststellen, dass Sie viele Felder mit "@Value" haben, sollten Sie stattdessen eine Konfigurations-Bean verwenden. Eine Bean "@ConfigurationProperties" kann auch auf die gleiche Weise mit "Setter" -Injektion behandelt werden, aber ich bevorzuge die Konstruktorinjektion, um sicher zu sein, dass zumindest die Bean niemals Null ist, auch wenn es Werte sind.

+0

Spring-Team sagt, dass Konstruktor sollte für erforderliche Abhängigkeiten und Setter für optional verwendet werden. Aber um ehrlich zu sein kann ich keinen Unterschied sehen (kann kein richtiges Beispiel finden) – Adam

+0

Ja, das ist richtig. Meine Antwort/Klärung ist irgendwie lang, also habe ich stattdessen meine Antwort bearbeitet. – Pytry

Verwandte Themen