Ist es ab Spring möglich, das Ergebnis des Aufrufs einer Methode auf eine ref-Bean zu injizieren?
Ich versuche, einen ausgeschnittenen / eingefügten Code aus zwei separaten Projekten in eine gemeinsame Klasse umzuwandeln. In einem der Projekte befindet sich der Code in einer Klasse, die ich "MyClient" nenne und die von Spring instanziiert wird. Es wird eine andere federinstanziierte Klasse "MyRegistry" injiziert, und die MyClient-Klasse verwendet diese Klasse, um einen Endpunkt zu suchen. Alles, was ich wirklich brauche, ist der Endpunkt-String in meiner überarbeiteten Klasse, der über einen Setter initialisiert werden kann. Ich kann im überarbeiteten Code wirklich keine Abhängigkeit von MyRegistry von MyClient haben.
Meine Frage lautet also: Gibt es eine Möglichkeit, den Endpunkt-String aus dem Frühling einzufügen, der in der MyRegistry-Klasse nachgeschlagen wurde? Also habe ich derzeit:
<bean id="registryService" class="foo.MyRegistry">
...properties set etc...
</bean>
<bean id="MyClient" class="foo.MyClient">
<property name="registry" ref="registryService"/>
</bean>
Aber ich hätte gerne (und ich weiß, dass dies eine imaginäre Spring-Syntax ist)
<bean id="MyClient" class="foo.MyClient">
<property name="endPoint" value="registryService.getEndPoint('bar')"/>
</bean>
Dabei hat MyRegistry eine Methode getEndPoint (Stirng endPointName).
Hoffe, das macht Sinn vom Standpunkt dessen, was ich erreichen will. Bitte lassen Sie mich wissen, ob so etwas im Frühling möglich ist!
factory-bean
undfactory-method
soll verwendet werden, ich werde dich wissen lassen :)Es ist in Spring 3.0 über Spring Expression Language möglich :
<bean id="registryService" class="foo.MyRegistry"> ...properties set etc... </bean> <bean id="MyClient" class="foo.MyClient"> <property name="endPoint" value="#{registryService.getEndPoint('bar')}"/> </bean>
quelle
foo.MyRegistry
noch kein Wert festgelegt ist. Zur Laufzeit ist sie also null und dieendPoint
In-MyClient
Bean ist sehr verwirrt, wenn versucht wird, sie festzulegen.Oder in Spring 2.x mithilfe eines BeanPostProcessors
public class MyClientBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware { private ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if((bean instanceof MyClient)) && (beanName.equals("MyClient"))) { Myregistry registryService = (Myregistry) applicationContext.getBean("registryService"); ((MyClient) bean).setEndPoint(registryService.getEndPoint("bar")); } return bean; } }
Und registrieren Sie Ihren BeanPostProcessor
<bean class="br.com.somthing.MyClientBeanPostProcessor"/>
quelle