Ich habe noch keine hochrangige Definition von Spring-Beans gefunden, die ich verstehen kann. Ich sehe sie oft in der Grails-Dokumentation und in Büchern erwähnt, aber ich denke, dass es von Vorteil wäre zu verstehen, was sie sind. Also, was sind Spring-Beans? Wie können sie verwendet werden? Haben sie etwas mit Dependency Injection zu tun?
Antworten
Zu viele Anzeigen?Die Referenzdokumentation von Spring Core-Technologien beschreibt, was Bohnen sind.
Laut dem Einführung in den Spring IoC-Container und Bohnen Abschnitt (wo "IoC" für "Inversion of control" steht):
In Spring werden die Objekte, die das Rückgrat Ihrer Anwendung bilden und vom Spring IoC-Container verwaltet werden, als Bohnen bezeichnet. Eine Bohne ist ein Objekt, das vom Spring IoC-Container instanziiert, zusammengebaut und verwaltet wird. Ansonsten ist eine Bohne einfach eines von vielen Objekten in Ihrer Anwendung. Bohnen und deren Abhängigkeiten sind in den Konfigurationsmetadaten, die von einem Container verwendet werden, reflektiert.
Bohnen und Umfang werden im Abschnitt Bohnenbereiche beschrieben:
Wenn Sie eine Bohnendefinition erstellen, erstellen Sie ein Rezept zur Erstellung tatsächlicher Instanzen der Klasse, die durch diese Bohnendefinition definiert ist. Die Idee, dass eine Bohnendefinition ein Rezept ist, ist wichtig, weil es bedeutet, dass Sie wie bei einer Klasse viele Objektinstanzen aus einem einzigen Rezept erstellen können.
Sie können nicht nur die verschiedenen Abhängigkeiten und Konfigurationswerte steuern, die in ein Objekt gesteckt werden sollen, das aus einer bestimmten Bohnendefinition erstellt wird, sondern auch den Umfang der aus einer bestimmten Bohnendefinition erstellten Objekte steuern. Dieser Ansatz ist leistungsstark und flexibel, weil Sie den Umfang der Objekte, die Sie durch Konfiguration erstellen, anstelle des Festlegens des Umfangs eines Objekts auf der Java-Klassenebene wählen können. Bohnen können für eins von mehreren Umfängen definiert werden.
Spring-Beans sind einfach Instanzobjekte, die vom Spring-Container verwaltet werden, dh sie werden vom Framework erstellt und verkabelt und in eine "Objekt-Tasche" (den Container) gesteckt, aus der Sie sie später abrufen können.
Der "Verkabelungs"-Teil ist es, worum es bei der Abhängigkeitsinjektion geht, was bedeutet, dass Sie einfach sagen können "Ich werde dieses Ding brauchen" und das Framework einige Regeln befolgen wird, um Ihnen die richtige Instanz zu geben.
Für jemanden, der nicht an Spring gewöhnt ist, denke ich, dass der Wikipedia-Artikel über Spring eine schöne Beschreibung hat:
Zentral für das Spring Framework ist sein Inversion-of-Control-Container, der eine konsistente Möglichkeit bietet, Java-Objekte unter Verwendung von Reflection zu konfigurieren und zu verwalten. Der Container ist dafür verantwortlich, die Lebenszyklen von spezifischen Objekten zu verwalten: Diese Objekte zu erstellen, ihre Initialisierungsmethoden aufzurufen und diese Objekte zu konfigurieren, indem sie miteinander verkabelt werden.
Von dem Container erstellte Objekte werden auch als verwaltete Objekte oder Beans bezeichnet. Der Container kann konfiguriert werden, indem XML-Dateien geladen oder spezifische Java-Annotationen in Konfigurationsklassen erkannt werden. Diese Datenquellen enthalten die Bean-Definitionen, die die Informationen bereitstellen, die benötigt werden, um die Beans zu erstellen.
Objekte können entweder durch Abhängigkeitsauflösung oder durch Abhängigkeitsinjektion erhalten werden. Abhängigkeitsauflösung ist ein Muster, bei dem ein Aufrufer das Containerobjekt nach einem Objekt mit einem bestimmten Namen oder Typ fragt. Abhängigkeitsinjektion ist ein Muster, bei dem der Container Objekte nach Namen an andere Objekte übergibt, entweder über Konstruktoren, Eigenschaften oder Fabrikmethoden.
Zuerst wollen wir Spring verstehen:
Spring ist ein leichtgewichtiges und flexibles Framework.
Java Beans sind Klassen, die viele Objekte in ein einziges Objekt (der Bean) kapseln. Der Name "Bean" wurde gewählt, um diesen Standard zu umfassen, der darauf abzielt, wiederverwendbare Softwarekomponenten für Java zu erstellen.
Spring Bean: ist ein Objekt, das im Spring Container erstellt, verwaltet und zerstört wird. Wir können ein Objekt in den Spring Container über die Metadaten (entweder XML oder Annotation) einfügen, was als Inversion of Control bezeichnet wird.
Analogy: Angenommen, ein Landwirt hat ein Ackerland, das durch Samen (oder Bohnen) bewirtschaftet wird. Hier ist der Landwirt das Spring Framework, das Ackerland ist der Spring Container, die Bohnen sind Spring Beans, die Bewirtschaftung ist der Spring Prozess.
Ähnlich wie bei Bohnen hat auch Spring Beans ihren eigenen Lebenszyklus.
Dies ist die Reihenfolge eines Bean-Lebenszyklus in Spring:
-
Instantiierung: Zuerst findet der Spring Container die Bean-Definition aus der XML-Datei und instantiiert die Bean.
-
Eigenschaften befüllen: Mit Hilfe der Dependency Injection befüllt Spring alle Eigenschaften gemäß der Bean-Definition.
-
Setzen des Bean-Namens: Wenn die Bean das
BeanNameAware
Interface implementiert, übergibt Spring die ID der Bean an diesetBeanName()
Methode. -
Setzen des Bean-Factories: Wenn die Bean das
BeanFactoryAware
Interface implementiert, übergibt Spring die Beanfactory an diesetBeanFactory()
Methode. -
Vor-Initialisierung: Auch als Nachbearbeitung der Bean bezeichnet. Wenn es BeanPostProcessors gibt, die mit der Bean verbunden sind, ruft Spring die Methode
postProcesserBeforeInitialization()
auf. -
Beans initialisieren: Wenn die Bean
IntializingBean
implementiert, wird ihreafterPropertySet()
Methode aufgerufen. Wenn die Bean eine Initialisierungsmethodendeklaration hat, wird die spezifizierte Initialisierungsmethode aufgerufen. -
Nach-Initialisierung: Wenn es BeanPostProcessors gibt, die mit der Bean verbunden sind, werden deren
postProcessAfterInitialization()
Methoden aufgerufen. -
Bereit zur Verwendung: Jetzt ist die Bean bereit zur Verwendung durch die Anwendung
-
Zerstörung: Wenn die Bean
DisposableBean
implementiert, wird diedestroy()
Methode aufgerufen
Ein Bean ist ein POJO (Plain Old Java Object), das vom Spring-Container verwaltet wird.
Spring-Container erstellen standardmäßig nur eine Instanz des Beans. Dieses Bean wird im Speicher zwischengespeichert, sodass alle Anfragen nach dem Bean eine gemeinsame Referenz auf dasselbe Bean zurückgeben.
Die @Bean-Annotation gibt ein Objekt zurück, das von Spring als Bean im Anwendungskontext registriert wird. Die Logik innerhalb der Methode ist dafür verantwortlich, die Instanz zu erstellen.
Wann verwenden wir die @Bean-Annotation?
Wenn die automatische Konfiguration keine Option ist. Zum Beispiel, wenn wir Komponenten aus einer Bibliothek eines Drittanbieters verkabeln möchten, weil der Quellcode nicht verfügbar ist und wir die Klassen nicht mit @Component annotieren können.
Ein realistisches Szenario könnte sein, dass jemand eine Verbindung zu einem Amazon S3-Bucket herstellen möchte. Da der Quellcode nicht verfügbar ist, müsste er ein @Bean erstellen.
@Bean
public AmazonS3 awsS3Client() {
BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsKeyId, accessKey);
return AmazonS3ClientBuilder.standard().withRegion(Regions.fromName(region))
.withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
}
Quelle für den obigen Code -> https://www.devglan.com/spring-mvc/aws-s3-java
Weil ich oben die @Component-Annotation erwähnt habe.
@Component gibt an, dass eine annotierte Klasse ein "Komponente" ist. Solche Klassen gelten als Kandidaten für die automatische Erkennung bei der Verwendung der konfigurationsbasierten Annotation und des Klassenpfad-Scannens.
Die Komponentenannotation registriert die Klasse als eine einzelne Bean.
Nun hast du es teilweise verstanden. Du musst die Beans entsprechend deinem Bedarf anpassen und dem Spring-Container mitteilen, dass er sie verwalten soll, wenn nötig, indem du eine Methode verwendest, die allgemein als IoC (Inversion of Control) bekannt ist, geprägt von Martin Fowler, auch bekannt als Dependency Injection (DI).
Du verknüpfst die Beans so, dass du dich nicht um das Instanziieren kümmern oder irgendwelche Abhängigkeiten bewerten musst. Dies ist allgemein bekannt als Hollywood-Prinzip.
Google ist das beste Werkzeug, um mehr darüber zu erfahren, zusätzlich zu den Links, mit denen du hier in dieser Frage überschwemmt wirst. :)
- See previous answers
- Weitere Antworten anzeigen