ApplicationContext.getBean (Klasse clazz) funktioniert nicht gut mit Proxies

8

Ich habe eine Bean-Definition in Spring und ihr Proxy-Gegenstück, das überall verwendet werden soll:

%Vor%

Das alles funktioniert gut; und in der Vor-Frühlings-v3-Welt benutzte ich es wie

%Vor%

Im Frühjahr 3 wurde es möglich, typsichere Suchvorgänge durchzuführen, z. B .:

%Vor%

Auch dies funktioniert gut für normale Bohnen, während ich für proxied Bohnen my.BeanTarget anstelle von my.Bean bekomme. Ich habe versucht, my.BeanTarget (wie in der Spring-Dokumentation gezeigt) einzubinden, um es zu verstecken, aber alles, was ich bekam, war

%Vor%

So ist es möglich, Typ-Safe-Bean-Lookups mit Proxied-Beans zu verwenden, und wenn ja - wie?

    
mindas 26.08.2010, 10:11
quelle

4 Antworten

6

Das Problem ist hier scope="prototype" auf Ihrem ProxyFactoryBean .

Der Kontext initialisiert Singleton-Bean-Definitionen nur eifrig. Bohnen mit Nicht-Singleton-Geltungsbereich werden nur initialisiert, wenn sie danach gefragt werden. Das heißt, wenn Sie den Kontext für Beans eines bestimmten Typs fragen, kann der Kontext diese Nicht-Singleton-Beans nicht initialisieren, um sie nach ihrem Typ zu fragen. Sie müssen lediglich auf die Informationen in der Bean-Definition zurückgreifen.

Im Fall von ProxyFactoryBean wird der Typ des generierten Proxys durch eine komplexe Logik bestimmt, die erfordert, dass das Bean vollständig initialisiert wird. Ohne diese Initialisierung kann ProxyFactoryBean den Zieltyp nur als null melden.

Ich kann nichts anderes sagen, als eine Singleton-Bean-Definition zu verwenden oder explizit nach dem Namen der Bean zu fragen, z. B.

%Vor%

und dann:

%Vor%

Hier verwenden wir die Konvention der Bean-Namen als Schnittstelle, die sie implementieren.

    
skaffman 26.08.2010, 11:14
quelle
2

Der Umfang der Proxies, die von ProxyFactoryBean erstellt wurden, sollte mit singleton property anstelle von scope attribut angegeben werden:

%Vor%

Dies löste das Problem, wenn die Zielbohne innerlich ist.

Wenn Sie mehrere Top-Level-Beans der gleichen Klasse haben, können Sie eine typsichere Suche nach ID verwenden:

%Vor%     
axtavt 26.08.2010 10:48
quelle
1

Können Sie my.Interface foo = ctx.getBean(my.Bean.class); nicht erstellen?

    
Bozho 26.08.2010 10:37
quelle
0

Da Spring mit Interfaces arbeitet, könnten Sie im Kontext von aop verschiedene Interfaces definieren und das erwartete Interface anfordern. Auf diese Weise wird keine Besetzung für eine echte Klasse benötigt, aber Spring wird die Schnittstellen verwalten.

Nehmen wir an, Sie haben Klasse A implementiert B. Sie möchten A nach B umwandeln, aber es wird abgelehnt, da A aufgrund von aop ein Proxy ist. Dann machen A implementiert C und C erweitert B. C besitzt benötigte Methoden und C ist private Schnittstelle, auf die nur von Ihrem Implementierungscode zugegriffen wird. Schließlich bitten Sie den Frühling, entweder B oder C abhängig von Ihren Erwartungen zu spritzen.

%Vor%

Auf diese Weise implementiert die private Klasse, selbst wenn die reale Klasse ein Proxy ist, Ihre private Schnittstelle mit allem, was Sie brauchen.

    
Cyrille Cormier 02.05.2017 17:01
quelle

Tags und Links