Datei ApplicationContext.getBean(Class clazz) nicht gut gehen mit proxies
Habe ich eine bean-definition in Feder und proxy-Pendant, welches dazu gedacht ist, um überall eingesetzt werden:
<bean name="my.Bean" class="org.springframework.aop.framework.ProxyFactoryBean" scope="prototype">
<property name="proxyInterfaces" value="my.Interface"/>
<property name="target" ref="my.BeanTarget"/>
<property name="interceptorNames">
<list>
<value>someInterceptor</value>
</list>
</property>
</bean>
<bean name="my.BeanTarget" class="my.InterfaceImpl" scope="prototype">
<property name="foo" ref="bar"/>
</bean>
Dies alles funktioniert gut; und in der pre-Spring-v3-Welt war ich es
ApplicationContext ctx = ...;
my.Interface foo = (my.Interface) ctx.getBean("my.Bean"); //cast is necessary
Im Frühjahr 3 wurde es möglich, sichere Typ-Suchvorgänge, z.B.:
my.Interface foo = ctx.getBean(my.Interface.class);
Wieder, das funktioniert gut für normale Bohnen in der Erwägung, dass für die weitergeleitete-Bohnen bin ich immer my.BeanTarget
statt my.Bean
. Ich habe versucht, inline - my.BeanTarget
(wie gezeigt in der Spring-Dokumentation) machen es versteckt, aber alles was ich bekam war
org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [my.Interface] is defined: expected single bean but found 0:
So ist es möglich, sichere Typ-bean-lookups mit Proxy-beans und wenn ja, wie?
- Tun Sie wirklich brauchen, um die Interaktion mit dem Kontext direkt? Die meisten meiner Anwendungen nur jemals brauchen, um bootstrap und dann alles andere wird behandelt mit dependency injection (das für die weitergeleitete-Bohnen). Ich bin schon einige framework-Sachen, wo habe ich Zugriff auf die Kontext -, aber, in meiner Erfahrung, war es selten.
- Unser system ist sehr breit und einige bits und Klassen werden nicht geboren, im Frühling (noch sein kann), so müssen die beanFactory/appCtx um die benötigten Abhängigkeiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem hier ist die
scope="prototype"
auf IhreProxyFactoryBean
.Wird der Kontext nur eifrig Initialisierung des singleton-bean-Definitionen. Bohnen von nicht-singleton-scope werden nur initialisiert, wenn gefragt. Dies bedeutet, dass, wenn Sie bitten, den Kontext, der für Bohnen von einem bestimmten Typ, der den Kontext nicht initialisiert nicht-singleton-beans, um Sie zu bitten Sie, für Ihre Art, es zu gehen hat, rein auf die Informationen in der bean-definition.
Im Fall von
ProxyFactoryBean
, den Typ der generierten proxy ist bestimmt durch eine komplexe Logik, die erfordert die Bohne vollständig initialisiert ist. Ohne diese InitialisierungProxyFactoryBean
kann den Bericht nur das Ziel geben, alsnull
.Kann ich nicht sagen, einen Weg, um dieses, andere als die Verwendung einer singleton-bean-definition, oder ist ausdrücklich aufgefordert, für die bean-Namen, z.B.
dann:
Hier verwenden wir die Konvention der bean-Namen der Schnittstelle, die Sie implementieren.
Sieht es aus wie der Umfang der Vollmacht erstellt von
ProxyFactoryBean
sollte angegeben werden, mitsingleton
- Eigenschaft anstelle derscope
Attribut:Dadurch das problem gelöst ist, wenn sich das Ziel-bean-innen.
Wenn Sie mehrere top-level-Bohnen der gleichen Klasse, die Sie verwenden können, eine Typ-sichere-Suche nach id:
getBean(String, Class)
? Können Sie bitte erklären?id
odername
- Attribut in der XML-Konfiguration.Kann man nicht machen
my.Interface foo = ctx.getBean(my.Bean.class);
?Als Feder arbeitet mit Schnittstellen, die im Kontext der aop, definieren Sie die verschiedenen Schnittstellen und Anfrage, die Sie erwarten. Dieser Weise, kein cast erforderlich sein, um eine echte Klasse, aber der Frühling verwalten Schnittstellen.
Lassen Sie uns sagen, Sie haben Eine Klasse implementiert, B. Sie will cast A nach B, sondern es ist abgelehnt als ein proxy aufgrund von aop.
Dann machen Sie implementiert C und C extends B, C besitzt, benötigt Methoden, und C ist die private Schnittstelle zugegriffen nur von Ihrer Implementierung code.
Schließlich Fragen Sie den Frühling, um zu injizieren, die entweder B-oder C-je nach Ihren Erwartungen.
Diese Weise, auch wenn Sie echt Klasse ist ein proxy, setzt Sie Ihr Eigenes Interface mit allen was Ihr braucht.