Auto-cast Spring-Bean
Ist es ein Weg, um auto-cast Spring-Bean der Klasse in der Anwendung definierte XML-Kontext? Ich möchte vermeiden, geben Sie Informationen über die Bohnen in 2 Orten.... in der xml-Konfigurations-Datei und auch im code ein cast.
Beispielsweise angesichts dieser config-Datei
<bean id="bean-name" class="SimpleSpringBean" scope="prototype">
<property name="myValue" value="simple value"></property>
</bean>
Kann ich anrufen ApplicationContext.getBean("bean-name")
in einer Weise zu vermeiden, direkt Gießen Sie den Rückgabetyp zu SimpleStringBean
. Ich weiß ich kann auch anrufen ApplicationContext.getBean("bean-name", SimpleSpringBean.class)
zu vermeiden, die Besetzung selbst, aber ich habe immer noch die info geben an 2 stellen.
Es scheint, dass der Frühling erhalten die Klasse info (ApplicationContext.getType
) oder indem man den Typ von der bean selbst, aber keine Möglichkeit, automatisch wandeln Sie den Typ ohne Programmierer eingreifen.
SimpleStringBean var = ApplicationContext.getBean("bean-name");
Aber das sieht aus wie in den Pausen java: was tut getBean(String)
zurück?
InformationsquelleAutor Vinnie | 2009-05-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stimme ich mit Sii, sollten Sie vermeiden, Aufruf von getBean so viel wie Sie können. Verkabeln Sie einfach Ihre Bohnen für die Klassen, die hängt von Ihnen ab.
Immer noch, wenn Sie eine einzelne Klasse, die enthält die Anwendung Rahmen, können Sie einen wrapper generische Methode wie folgt:
Dann rufen Sie es ohne casting
ein. Sie hat die casting-problem b ist. dein code hat Abhängigkeit auf das spring-framework c. Sie werden wahrscheinlich verwenden Sie statische Methoden, um auf die Anwendung zuzugreifen Kontext, reduzieren Sie Ihre code Testbarkeit d. die Kern-Idee hinter dem framework spring ist dependency injection, wenn bean Einen hängt davon ab, bean B, spring injiziert werden können, die Abhängigkeit für Sie, keine Notwendigkeit zu nennen getBean
Grundsätzlich, wenn Sie das bootstrapping-Anwendung selbst, werden Sie wollen, um eine einzelne Klasse, dass Sie möglicherweise mit getBean() in main, und über die Abhängigkeiten, die Sie konfiguriert haben, die Feder baut Ihre ganze objektgraphen mit dependency injection. Der springende Punkt ist für keine der Klassen, zu wissen, oder Pflege, wie Sie Ihre Abhängigkeiten, und wenn Sie den Aufruf getBean(), die Sie definitiv nicht egal!
in Bezug auf d, ich voll verstehen, ich würde das Frühjahr zu injizieren B in A, aber ich brauche immer noch Zugang zu Einem als einige Punkt, richtig? Wie bekomme ich das ohne Aufruf von getBean()?
Technisch, Sie nicht /wirklich/ müssen Zugang A. so stellen Sie sicher es ist nicht initialisiert früh mit
lazy="false"
) und legen Sie eine init-Methode, mit der die Anwendung starten.InformationsquelleAutor LiorH
Ist die Antwort, Sie sollte nicht mit der Datei ApplicationContext.getBean (), wenn es möglich ist, und tragen mit der Ort, den Sie haben in die bootstrap-code. (Generell sollte man nie verwenden müssen getBean() außerhalb der Anwendung Einstiegspunkte.)
Auch, was Sie Fragen, ist wahrscheinlich unmöglich in der Java-Sprache überhaupt. Casting ist eine compile-Zeit-Funktion, kombiniert mit einer Laufzeit überprüfen. Der return-Typ von getBean() einfach mit muss zur Kompilierzeit bekannt ist. Auch wenn der Frühling kann bestimmen den Typ eines Objekts, es nicht ändern kann, seine eigene Methode-Signaturen zur Laufzeit.
Andere Sache ist, dass selbst wenn dies möglich wäre, das feature wäre nicht besonders nützlich. Da Spring AOP ist implementiert unter Verwendung von dynamischen Proxys, Sie fast immer wollen, dass Feder zur hand, die Sie eine Instanz von einem interface der bean implementiert (die eine AOP-proxy), nicht von der Umsetzung Klasse.
InformationsquelleAutor millimoose
Anderen Ansatz, den ich auch verwenden, ist autowiring der bootstrapping-Klasse mit:
(Code erfolgt aus dem Speicher. Könnte nur arbeiten, wenn Sie die Spring-Kontext konfiguriert ist, um Prozess-Verdrahtung Anmerkungen, in diesem Fall macht setter für
foo
undbar
funktionieren sollte.)InformationsquelleAutor millimoose
Der Hauptgrund für
getBean
wird nicht typisiert ist die Kompatibilität der Spring - (bis version 2.5.x) mit Java 1.4. Spring 3.0 wird fallen, und bieten somit typisiertegetBean
Methode dann.Dennoch sollten Sie vermeiden suchen, bis die Bohnen direkt und minimieren Sie Ihre Nutzung so weit wie möglich.
InformationsquelleAutor Oliver Drotbohm
Was, wenn ich Spring als factory-Objekt, dass meine Bewerbung intensiv verwendet.
Das heißt, statt zu schreiben eine Reihe von Klassen, die bereits Erben oder wrap-around
bekannte Java-Klassen, die ich nur entscheiden, zu bewegen, alle, die in einer xml-Datei zu reduzieren
Zeilen Java-code. Dies wird bedeuten, dass viele Linien von xml-werde ich aber nicht machen müssen
Skelett Java-Klassen, die ich Spritzen mit Feder oder autowire. Damit die Linien
der Java-code weniger.
Aus diesem Grund und noch als ich neu bin, Spring ich einfach wie bereits in früheren
Beiträge verwendet statische Java-Methoden, die wrap-around der getBeans().
Ich gearbeitet habe, mit Feder, aber es ist immer noch neu für mich, also verzeiht meine Frage.
InformationsquelleAutor
"Da Spring AOP ist implementiert unter Verwendung von dynamischen Proxys, Sie fast immer wollen, dass Feder zur hand, die Sie eine Instanz von einem interface der bean implementiert (die eine AOP-proxy), nicht von der Implementierung der Klasse"
So dort ist keine Weise, die eine dynamische proxy-Nutzung getBean(), dann was ist die beste übung, wenn es keine Schnittstellen und es ist ein stand-alone-Treiber-Klasse ausgeführt werden?
InformationsquelleAutor user251779