2017-10-20 1 views
0

ich durch die Feder Dokumentation würde, und kam über die folgenden Anweisung-Warum getBean() sollte im Frühjahr Anwendung vermieden werden

Sie können dann getBean verwenden Instanzen Ihrer Bohnen abzurufen. Die Application Schnittstelle hat ein paar andere Methoden für Abrufen von Bohnen, sondern im Idealfall Code Anwendung sollte sie nie verwenden. Tat Anwendungscode sollte bei allen, keine Anrufe die getBean() Methode haben und somit alle keine Abhängigkeit von Frühlings-APIs auf . Zum Beispiel bietet die Integration von Spring mit Web-Frameworks Dependency-Injection für verschiedene Web-Framework-Komponenten wie Controller und JSF-gesteuerte Beans, so dass Sie eine Abhängigkeit von einer bestimmten Bean über Metadaten deklarieren können (z. B. eine Autoverringerung Annotation).

Ref- https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html

In meiner Anwendung, erhalte ich einige Parameter zu meiner Client-Methode, basierend auf denen, spritze ich ordnungsgemäße Umsetzung der Schnittstelle. Die Art, wie ich es mache, ist, nach der Verkettung dieser Parameter nach der Bean-ID zu suchen. Für Beispiel- wenn ich erhalten type=C, subType=D, bekomme ich die Bohne mit bean id=typeCsubTypeD von getBean (beanId) aufrufen. , d. H., Meine Abhängigkeiten werden über die Laufzeit entschieden.

Ich habe durch Why is Spring's ApplicationContext.getBean considered bad?

gegangen Aber dies deckt Fall meiner Verwendung nicht (wie auch durch einen Kommentar in dieser Frage angesprochen).

+0

interessante Frage, könnten Sie den Code teilen? Wie kommen Parameter zustande? – Andrew

+0

Mein Projekt wird als Jar-Bibliothek in einer anderen Anwendung verwendet. Diese Anwendung nennt die Methoden dieses Jar. Jetzt, basierend auf welchem ​​Parameter es passiert, muss ich die Bohne auswählen und das Ergebnis produzieren. – Deb

Antwort

1

Generell wäre mein Rat Aroma-of-the-Monats-Fanatiker zu vermeiden sein.

Heute Inversion of Control ist sehr viel Hype (als Teil der SOLID Design-Prinzipien), so dass, wenn jemand etwas verwendet, die gegen dieses Prinzip geht, werden die Menschen blind bash und sagt, dass man es mit vermeiden sollten . Die wirkliche Antwort ist jedoch, dass es keine universellen Gesetze gibt, wenn es um Software-Design geht. Wenn Sie gute Gründe haben für nicht Inversion of Control in Ihrer Anwendung verwenden, dann sind Sie ganz sicher gut mit getBean() verwenden. Was das Prinzip ist im Allgemeinen gemeint bedeuten soll „nicht getBean() in statischer Initialisierung Kontexten verwendet werden, wo man Inversion of Control stattdessen verwenden kann“.

Zum Beispiel haben wir eine Anwendung, die Feder als „Bean Skriptsprache“ verwendet, damit nicht-Entwickler konfigurierbare Java-Beans zu definieren, ohne eine vollwertige DSL zu verwenden. Wenn Sie Spring in dieser Hinsicht verwenden, gibt es keine vernünftige Methode, die Sie vermeiden können, getBean() zu verwenden.

+0

Wie funktioniert getBean() geht gegen IoC? Denn erschaffe ich noch Bohne Federbehälter (nicht durch die abhängige Klasse) und die Bohne zur Laufzeit zu bekommen. Die Abhängigkeit wird nicht zur Kompilierzeit aufgelöst. – Deb

+1

Da Sie auf einem 'ApplicationContext' angewiesen sind, es sei denn, der Kontext selbst injiziert wird, ist es nicht mehr voll IoC, weil Sie wissen, wie den Kontext selbst zu bekommen.Es gibt eine gute Diskussion unter dem Post, den Sie über den Unterschied zwischen Service Locator und IoC verbunden haben, und der von Ihnen erwähnte Anwendungsfall ist eher ein Service Locator als reiner IoC. –

Verwandte Themen