


Warum verbieten große Unternehmen die Verwendung der @Autowired-Annotation in Spring Boot-Projekten?
1. Beschreibung
Das Unternehmen hat kürzlich das Framework vom Original aktualisiert <span style="outline: 0px;Schriftgröße: 16px;Sichtbarkeit: sichtbar;">Spring Framerwork 3.0 <code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;letter-spacing: 0.034em;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);visibility: visible;'><span style="outline: 0px;font-size: 16px;visibility: visible;">spring framerwork 3.0</span>
升级到<span style="outline: 0px;font-size: 16px;visibility: visible;">5.0</span>
Upgrade auf <span style="outline: 0px;font-size: 16px;sichtbarkeit: sichtbar;">5.0</span>
, und dann, als ich den Code schrieb Ich habe plötzlich herausgefunden, dass die @Autowired
-Annotation für die Attributinjektion eine Warnung ausgibt, wie die folgende, was ziemlich verwirrend ist. Schließlich wurde sie schon seit vielen Jahren so geschrieben. Eine Feldinjektion wird nicht empfohlen
Ich habe die relevanten Dokumente überprüft und festgestellt, dass diese Eingabeaufforderung nach <code style="outline: 0px;visibility: visible;"><span style="outline: 0px;font-size: 16px;visibility: visible;">spring framerwork 4.0</span>
以后开始出现的,spring 4.0开始就不推荐使用属性注入,改为推荐构造器注入和setter注入。
下面将展示了spring框架可以使用的不同类型的依赖注入,以及每种依赖注入的适用情况。
2、依赖注入的类型
尽管针对<span style="outline: 0px;font-size: 16px;">spring framerwork 5.1.3</span>
spring Framerwork 4.0 angezeigt wurde, aber danach nicht mehr angezeigt wird Spring 4.0 wird empfohlen, Eigenschaftsinjektion zu verwenden, und stattdessen werden Konstruktorinjektion und Setterinjektion empfohlen.
🎜
2. Arten der Abhängigkeitsinjektion🎜🎜
🎜spring Framerwork 5.1.3🎜🎜 nur zwei Haupttypen der Abhängigkeitsinjektion definiert, gibt es tatsächlich drei;🎜 🎜</p> <ul class="list-paddingleft-1" data-tool="mdnice编辑器" style='margin-top: 8px;margin-bottom: 8px;padding-left: 25px;outline: 0px;font-family: system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;background-color: rgb(255, 255, 255);'> <li style="outline: 0px;font-size: 16px;"><section style="margin-top: 5px;margin-bottom: 5px;outline: 0px;line-height: 26px;color: rgb(1, 1, 1);"><span style="outline: 0px;">Konstruktorbasierte Abhängigkeitsinjektion</span></section></li> <li style="outline: 0px;font-size: 16px;"><section style="margin-top: 5px;margin-bottom: 5px;outline: 0px;line-height: 26px;color: rgb(1, 1, 1);"><span style="outline: 0px;">Setterbasierte Abhängigkeitsinjektion</span></section></li> <li style="outline: 0px;font-size: 16px;"><section style="margin-top: 5px;margin-bottom: 5px;outline: 0px;line-height: 26px;color: rgb(1, 1, 1);"><span style="outline: 0px;">Feldbasierte Abhängigkeitsinjektion</span></section></li> </ul> <p data-tool="mdnice编辑器" style='margin-bottom: 0px;padding-top: 8px;padding-bottom: 8px;outline: 0px;font-family: system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;background-color: rgb(255, 255, 255);line-height: 26px;'><span style="outline: 0px;font-size: 16px;">where</span><code. style="out Zeile: 0px; "> <code style="outline: 0px;"><span style="outline: 0px;font-size: 16px;">基于字段的依赖注入</span>Feldbasierte Abhängigkeitsinjektion ist weit verbreitet, aber Ideen oder andere statische Code-Analysetools geben sofortige Meldungen aus und werden nicht empfohlen.
Sie können diese Injektionsmethode sogar in einigen offiziellen Spring-Anleitungen sehen:
2.1 Konstruktorbasierte Abhängigkeitsinjektion
Bei der konstruktorbasierten Abhängigkeitsinjektion wird die Klassenkonstruktion mit @ kommentiert Automatisch verdrahtet und enthält eine Reihe von Parametern, die sich auf das einzuspritzende Objekt beziehen.
@Component public class ConstructorBasedInjection { private final InjectedBean injectedBean; @Autowired public ConstructorBasedInjection(InjectedBean injectedBean) { this.injectedBean = injectedBean; } }
public class SimpleMovieLister { // the SimpleMovieLister has a dependency on a MovieFinder private MovieFinder movieFinder; // a constructor so that the Spring container can inject a MovieFinder public SimpleMovieLister(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // business logic that actually uses the injected MovieFinder is omitted... }
基于构造函数注入的主要优点是可以将需要注入的字段声明为final, 使得它们会在类实例化期间被初始化,这对于所需的依赖项很方便。
2.2 基于Setter的依赖注入
在基于setter的依赖注入中,setter方法被标注为 @Autowired。一旦使用无参数构造函数或无参数静态工厂方法实例化Bean,为了注入Bean的依赖项,Spring容器将调用这些setter方法。
@Component public class SetterBasedInjection { private InjectedBean injectedBean; @Autowired public void setInjectedBean(InjectedBean injectedBean) { this.injectedBean = injectedBean; } }
和基于构造器的依赖注入一样,在官方文档中,基于Setter的依赖注入中的 @Autowired也可以省去。
public class SimpleMovieLister { // the SimpleMovieLister has a dependency on the MovieFinder private MovieFinder movieFinder; // a setter method so that the Spring container can inject a MovieFinder public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // business logic that actually uses the injected MovieFinder is omitted... }
2.3 基于属性的依赖注入
在基于属性的依赖注入中,字段/属性被标注为 @Autowired。一旦类被实例化,Spring容器将设置这些字段。
@Component public class FieldBasedInjection { @Autowired private InjectedBean injectedBean; }
正如所看到的,这是依赖注入最干净的方法,因为它避免了添加样板代码,并且不需要声明类的构造函数。代码看起来很干净简洁,但是正如代码检查器已经向我们暗示的那样,这种方法有一些缺点。
3. Fehler bei der feldbasierten Abhängigkeitsinjektion unveränderlich Funktioniert nicht, da diese Felder beim Instanziieren der Klasse instanziiert werden müssen. Die einzige Möglichkeit, unveränderliche Abhängigkeiten zu deklarieren, ist die Verwendung der konstruktorbasierten Abhängigkeitsinjektion.In der objektorientierten Programmierung werden die fünf Designprinzipien SOLID häufig verwendet (in China im Allgemeinen sechs Designprinzipien), um die Wiederverwendbarkeit von Code zu verbessern. Lesbarkeit, Zuverlässigkeit und Wartbarkeit
S in SOLID stellt das Prinzip der Einzelverantwortung dar, das heißt, eine Klasse sollte nur für eine Verantwortung verantwortlich sein, und alle von dieser Klasse bereitgestellten Dienste sollten nur für die Verantwortung verantwortlich sein, für die sie verantwortlich ist für Serve.
Mit der feldbasierten Abhängigkeitsinjektion werden wir der Klasse im Laufe der Zeit immer mehr Abhängigkeiten hinzufügen und es ist einfach, die Abhängigkeiten in der Klasse zu ignorieren . Wenn Sie jedoch die konstruktorbasierte Abhängigkeitsinjektion verwenden, wird der Konstruktor immer größer, wenn der Klasse immer mehr Abhängigkeiten hinzugefügt werden, und wir können auf den ersten Blick erkennen, dass etwas nicht stimmt.
Ein Konstruktor mit mehr als 10 Parametern ist ein klares Zeichen dafür, dass sich die Klasse in eine große und umfassende Sammlung von Funktionen verwandelt hat und in kleinere, besser wartbare Teile aufgeteilt werden muss.
Obwohl die Vermögenszuführung keine direkte Ursache für einen Verstoß gegen das Prinzip der Einzelverantwortung ist, verbirgt sie Signale und macht es uns leicht, sie zu ignorieren.
3.3 Eng gekoppelt mit dem Abhängigkeitsinjektionscontainer
Der Hauptgrund für die Verwendung der feldbasierten Abhängigkeitsinjektion besteht darin, Boilerplate-Code für Getter und Setter zu vermeiden oder Konstruktoren für Klassen zu erstellen. Letztendlich bedeutet dies, dass die einzige Möglichkeit, diese Felder festzulegen, darin besteht, die Klasse über den Spring-Container zu instanziieren und sie mithilfe von Reflektion einzufügen, andernfalls bleiben die Felder null.
Das Dependency-Injection-Entwurfsmuster entkoppelt die Erstellung von Klassenabhängigkeiten von der Klasse selbst und überträgt diese Verantwortung auf den Klasseninjektionscontainer, sodass der Programmentwurf entkoppelt werden kann und den Prinzipien der Einzelverantwortung und der Abhängigkeitsumkehr folgt (gleichermaßen zuverlässig). Daher geht die Entkopplung der Klasse, die durch die automatische Verdrahtung von Feldern erreicht wird, schließlich verloren, indem sie erneut an den Klasseninjektionscontainer (in diesem Fall Spring) gekoppelt wird, wodurch die Klasse außerhalb des Spring-Containers unbrauchbar wird.
Das bedeutet, dass Sie, wenn Sie Ihre Klasse außerhalb des Anwendungscontainers verwenden möchten, beispielsweise für Unit-Tests, gezwungen sind, den Spring-Container zum Instanziieren Ihrer Klasse zu verwenden, da es keine andere Möglichkeit (außer Reflektion) zum Einrichten gibt Autowiring-Felder.
3.4 Versteckte Abhängigkeiten
Bei Verwendung der Abhängigkeitsinjektion sollte die betroffene Klasse diese Abhängigkeiten eindeutig über eine öffentliche Schnittstelle offenlegen, indem sie die erforderlichen Abhängigkeiten im Konstruktor offenlegt oder mithilfe von Methoden (Settern) optionale Abhängigkeiten offenlegt. Bei Verwendung der feldbasierten Abhängigkeitsinjektion sind diese Abhängigkeiten im Wesentlichen vor der Außenwelt verborgen.
4. Zusammenfassung
Wir haben gesehen, dass die feldbasierte Injektion möglichst vermieden werden sollte, da sie viele Nachteile mit sich bringt, egal wie elegant sie aussieht. Der empfohlene Ansatz ist die Verwendung einer konstruktorbasierten und setterbasierten Abhängigkeitsinjektion.
Für erforderliche Abhängigkeiten wird empfohlen, eine konstruktorbasierte Injektion zu verwenden, sie unveränderlich zu machen und zu verhindern, dass sie null sind. Für optionale Abhängigkeiten wird die Verwendung einer Setter-basierten Injektion empfohlen.
Das obige ist der detaillierte Inhalt vonWarum verbieten große Unternehmen die Verwendung der @Autowired-Annotation in Spring Boot-Projekten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



In tatsächlichen Projekten versuchen wir, verteilte Transaktionen zu vermeiden. Manchmal ist es jedoch wirklich notwendig, einige Dienste aufzuteilen, was zu Problemen bei verteilten Transaktionen führt. Gleichzeitig werden in Vorstellungsgesprächen auch verteilte Transaktionen auf dem Markt gefragt. Sie können diesen Fall üben und im Vorstellungsgespräch über 123 sprechen.

Mit der Entwicklung der Globalisierung müssen immer mehr Websites und Anwendungen mehrsprachige Unterstützung und Internationalisierungsfunktionen bieten. Für Entwickler ist die Implementierung dieser Funktionen keine leichte Aufgabe, da sie die Berücksichtigung vieler Aspekte erfordert, wie z. B. Sprachübersetzung, Datums-, Zeit- und Währungsformate usw. Mithilfe des SpringBoot-Frameworks können wir jedoch problemlos mehrsprachige Unterstützung und internationale Anwendungen implementieren. Lassen Sie uns zunächst die von SpringBoot bereitgestellte LocaleResolver-Schnittstelle verstehen. Ort

Mit dem Aufstieg digitaler Währungen wie Bitcoin ist die Blockchain-Technologie nach und nach zu einem heißen Thema geworden. Smart Contracts können als wichtiger Bestandteil der Blockchain-Technologie angesehen werden. SpringBoot kann als beliebtes Java-Backend-Entwicklungsframework auch zum Erstellen von Blockchain-Anwendungen und Smart Contracts verwendet werden. In diesem Artikel erfahren Sie, wie Sie mit SpringBoot Anwendungen und Smart Contracts auf Basis der Blockchain-Technologie erstellen. 1. SpringBoot und Blockchain Zunächst müssen wir einige grundlegende Konzepte im Zusammenhang mit Blockchain verstehen. Blockchain

Im Entwicklungsprozess von Java-Webanwendungen wird die ORM-Mapping-Technologie (Object-RelationalMapping) verwendet, um relationale Daten in der Datenbank Java-Objekten zuzuordnen, sodass Entwickler bequem auf Daten zugreifen und diese bearbeiten können. Als eines der derzeit beliebtesten Java-Webentwicklungs-Frameworks bietet SpringBoot eine Möglichkeit zur Integration von MyBatis, und MyBatisPlus ist ein auf MyBatis basierendes ORM-Framework.

Mit dem Aufkommen des Big-Data-Zeitalters beginnen immer mehr Unternehmen, den Wert von Big Data zu verstehen, zu erkennen und ihn auf das Geschäft anzuwenden. Das damit verbundene Problem besteht darin, mit diesem großen Datenfluss umzugehen. In diesem Fall sind Big-Data-Verarbeitungsanwendungen zu etwas geworden, das jedes Unternehmen in Betracht ziehen muss. Für Entwickler ist auch die Verwendung von SpringBoot zum Erstellen einer effizienten Big-Data-Verarbeitungsanwendung ein sehr wichtiges Thema. SpringBoot ist ein sehr beliebtes Java-Framework, das dies ermöglicht

Mit der Entwicklung des Internets sind Big-Data-Analyse und Echtzeit-Informationsverarbeitung zu einem wichtigen Bedarf für Unternehmen geworden. Um diesen Anforderungen gerecht zu werden, erfüllen herkömmliche relationale Datenbanken nicht mehr die Anforderungen der Geschäfts- und Technologieentwicklung. Stattdessen ist die Verwendung von NoSQL-Datenbanken zu einer wichtigen Option geworden. In diesem Artikel besprechen wir die Verwendung von SpringBoot, das in NoSQL-Datenbanken integriert ist, um die Entwicklung und Bereitstellung moderner Anwendungen zu ermöglichen. Was ist eine NoSQL-Datenbank? NoSQL ist nicht nur SQL

Mit der kontinuierlichen Weiterentwicklung und Popularisierung des Internets steigt auch der Bedarf an Datenverarbeitung und -speicherung. Wie Daten effizient und zuverlässig verarbeitet und gespeichert werden können, ist zu einem heißen Thema in Industrie und Forschung geworden. Das auf SpringBoot basierende verteilte Daten-Caching- und Speichersystem ist eine Lösung, die in den letzten Jahren viel Aufmerksamkeit erregt hat. Was ist ein verteiltes Daten-Caching- und Speichersystem? Verteilte Daten-Caching- und Speichersysteme beziehen sich auf die verteilte Speicherung von Daten über mehrere Knoten (Server), was die Sicherheit und Zuverlässigkeit der Daten verbessert und auch die Datenverarbeitung verbessern kann.

Da moderne Unternehmen immer mehr auf eine Vielzahl unterschiedlicher Anwendungen und Systeme angewiesen sind, wird die Unternehmensintegration noch wichtiger. Enterprise Service Bus (ESB) ist ein Integrationsarchitekturmodell, das verschiedene Systeme und Anwendungen miteinander verbindet, um gemeinsame Datenaustausch- und Nachrichtenroutingdienste bereitzustellen und eine Anwendungsintegration auf Unternehmensebene zu erreichen. Mit SpringBoot und ApacheServiceMix können wir ganz einfach ein ESB-System erstellen. In diesem Artikel wird die Implementierung vorgestellt. SpringBoot und A
