Ich las in einigen Beiträgen über Spring MVC und Portlets , dass Feldeinkopplung nicht empfohlen. So wie ich es verstehe, ist Feldinjektion, wenn Sie einer Bohne Folgendes injizieren @Autowired
:
@Component
public class MyComponent {
@Autowired
private Cart cart;
}
Während meiner Recherche las ich auch über Konstruktorinjektion :
@Component
public class MyComponent {
private final Cart cart;
@Autowired
public MyComponent(Cart cart){
this.cart = cart;
}
}
Was sind die Vor- und Nachteile dieser beiden Arten von Injektionen?
EDIT 1: Da diese Frage als Duplikat dieser Frage markiert ist , habe ich sie überprüft. Da es weder in der Frage noch in den Antworten Codebeispiele gibt, ist mir nicht klar, ob ich mit meiner Vermutung, welchen Injektionstyp ich verwende, richtig bin.
Date(int,int,int)
existiert.Antworten:
Einspritzarten
Es gibt drei Möglichkeiten, wie Abhängigkeiten in eine Bean eingefügt werden können:
Sie verwenden Option 3. Dies geschieht, wenn Sie
@Autowired
direkt auf Ihrem Feld verwenden.Injektionsrichtlinien
Eine allgemeine Richtlinie, die von Spring empfohlen wird (siehe Abschnitte zu konstruktorbasiertem DI oder Setter-basiertem DI ), lautet wie folgt:
Nachteile der Feldinjektion
Die Gründe, warum die Feldinjektion verpönt ist, sind folgende:
Fazit
Abhängig von Ihren Anforderungen sollten Sie hauptsächlich die Konstruktorinjektion oder eine Mischung aus Konstruktor- und Setterinjektion verwenden. Die Feldinjektion hat viele Nachteile und sollte vermieden werden. Der einzige Vorteil der Feldinjektion besteht darin, dass das Schreiben bequemer ist, was nicht alle Nachteile überwiegt.
Weiterführende Literatur
Ich habe einen Blog-Artikel darüber geschrieben, warum Feldinjektion normalerweise nicht empfohlen wird: Feldabhängigkeitsinjektion wird als schädlich angesehen .
quelle
Dies ist eine der unendlichen Diskussionen in der Softwareentwicklung, aber die wichtigsten Einflussfaktoren in der Branche werden zunehmend zu dem Thema aufgefordert und schlagen vor, die Konstruktorinjektion als bessere Option vorzuschlagen.
Konstruktorinjektion
Vorteile:
Nachteile:
Grundsätzlich ist die Feldinjektion das Gegenteil.
quelle
Geschmackssache. Es ist deine Entscheidung.
Aber ich kann erklären, warum ich niemals Konstruktorinjektion verwende .
Ich möchte nicht einen Konstruktor für alle meine implementieren
@Service
,@Repository
und@Controller
Bohnen. Ich meine, es gibt ungefähr 40-50 Bohnen oder mehr. Jedes Mal, wenn ich ein neues Feld hinzufüge, muss ich den Konstruktor erweitern. Nein, ich will es nicht und ich muss nicht.Was ist, wenn für Ihre Bean (Service oder Controller) viele andere Beans injiziert werden müssen? Ein Konstruktor mit 4+ Parametern ist sehr hässlich.
Wenn ich CDI verwende, geht mich der Konstruktor nichts an.
EDIT # 1 : Vojtech Ruzicka sagte:
Ja. Theorie und Realität. Hier ist ein Beispiel:
DashboardController
einem einzelnen Pfad zugeordnet*:8080/dashboard
.My
DashboardController
sammelt viele Informationen von anderen Diensten, um sie auf einer Dashboard- / Systemübersichtsseite anzuzeigen. Ich brauche diesen einzelnen Controller. Ich muss also nur diesen einen Pfad sichern (Basisauthentifizierung oder Benutzerrollenfilter).EDIT # 2 : Da sich jeder auf die 8 Parameter im Konstruktor konzentriert ... Dies war ein reales Beispiel - ein Legacy-Code des Kunden. Ich habe das geändert. Die gleiche Argumentation gilt für mich für 4+ Parameter.
Es geht nur um Code-Injection, nicht um Instanzkonstruktion.
quelle
Noch ein Kommentar - Vojtech Ruzicka erklärte, dass Spring Bohnen auf drei Arten injiziert (die Antwort mit der größten Anzahl von Punkten):
Diese Antwort ist FALSCH - denn FÜR JEDE ART VON INJEKTIONSFEDER VERWENDET REFLEXION! Verwenden Sie IDE, setzen Sie den Haltepunkt für Setter / Konstruktor und überprüfen Sie.
Dies kann Geschmackssache sein, aber auch FALL. @dieter lieferte einen hervorragenden Fall, wenn die Feldinjektion besser ist. Wenn Sie die Feldinjektion in Integrationstests verwenden, die den Spring-Kontext einrichten, ist das Argument mit der Testbarkeit der Klasse ebenfalls ungültig, es sei denn, Sie möchten später Tests in Ihre Integrationstests schreiben;)
quelle