Wie kann ich das überschreiben einer Spring-bean-definition noch immer die Referenz überschrieben bean?
Ich versuche zur Implementierung einer delegate-Service-provider durch überschreiben der bean-definition für die ursprüngliche Leistung mit meinem delegieren Service. Jedoch, wie der name schon impliziert, die delegate-Dienst benötigt eine Referenz auf das original-service, um Anrufe an.
Ich habe Probleme, herauszufinden, wie das überschreiben der bean-definition unter Verwendung der originalen bean def ohne einen Zirkelbezug Problem.
Beispiel:
<!-- Original service def in spring-context.xml -->
<bean id="service" class="com.mycompany.Service"/>
<!-- Overridden definition in spring-plugin-context.xml -->
<bean id="service" class="com.mycompany.DelegatedService"/>
<constructor-arg ref="service"/>
</bean>
Ist das möglich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort auf Ihre Frage ist, dass man nicht zwei bean-Definitionen mit dem gleichen Namen. Wenn Sie versuchen, ein ausblenden der anderen, und nur eine definition brauchbar.
Ihre Frage ein Beispiel zu zeigen scheint, dass Sie versuchen, wickeln Sie das original
service
bean in ein proxy-Objekt, mit dem wrapper, die einige vor-und-nach der Arbeit um Aufrufe an den service. Ein Weg dies zu erreichen, ohne definieren zweiservice
Bohnen, ohne änderung der ursprünglichenservice
bean, ist die Verwendung einer FederAutoProxyCreator
wohl eineBeanNameAutoProxyCreator
.Dies ermöglicht Ihnen, eine Liste Bohnen (oder Bohnen) werden automatisch umgeleitet. Geben Sie die Abfangjäger, die Sie wollen, um angewendet werden, um Aufrufe auf die Ziel-bean. Sie realisieren diese Abfangjäger zu tun, die Arbeit, die Sie tun müssen.
Frühling würde automatisch ein delegierender proxy für Sie, die hätten die bean id
service
wie vor, aber mit Ihren zusätzlichen Funktionen.AutoProxyCreator
nicht-proxy-Klassen, es Proxys bean. Es sollte keine Rolle, welchen classloader lädt der Ziel-Klasse, ist es das Ziel-Objekt umgeleitet, und im Frühjahr erzeugt, dass die target-Objekt.Können Sie erstellen proxies und Abfangjäger. So, jetzt die bean mit dem Namen
service
wird ein proxy zum originalservice
welche umbenannt werden muss, um etwas anderes. Damit die änderungen beschränken sich auf die Spring-XML-und nicht nur vermehrt werden, um Ihre java-code.Es klingt wie Sie versuchen, neu zu erfinden, spring-AOP. Denken Sie bitte über spring-AOP für diese.
Ist es möglich, programmgesteuert ändern Sie den Namen des bestehenden service und erstellen Sie eine neue Bohne mit dem alten Namen. Die autoproxying-code in das spring-framework funktioniert das, und Sie konnte einen Blick auf, die. Eine schnelle code-Suche für AutoProxy* in das spring-framework sollte dich dort.
Abwechselnd, wenn Sie die client-Seiten (die Verbraucher), könnte man hinzufügen, eine Qualifikation für Ihre wrapper, und verwenden Qualifier zu zwingen, die richtigen Umsetzungen zu den Verbrauchern. Der wrapper könnte die unqualifizierten implemementation, erhalten Sie Zugriff auf das original.
(Es könnte auch möglich sein retro-mount-qualifier auf der original-Implementierung durch das hinzufügen einer weiteren bean-definition für service mit einem qualifier in xml-code, den du kontrollierst, habe nicht versucht dies, aber es sollte funktionieren)
Verwenden Sie die "parent" - Attribut des "ref" - element mit einem übergeordneten container.
Sie finden ein ausführliches Beispiel in der Spring-Dokumentation: http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-ref-element
Geschrieben habe, einen blog-post auf, wie dies sehr schön:
http://www.solubris.com/blog/overriding_spring_context_for_testing
Platzhalter-Kontext-Definitionen bedeutet, dass Sie brauchen nicht zu verwenden, importiert.
Eltern nicht arbeiten, wenn Sie wollen, neu zu definieren, die gleiche Bohne mit der gleichen id.