Quelle: set Eigenschaft einer Bean durch die Eigenschaft eines anderen Bean zu lesen?
-
05-07-2019 - |
Frage
Ist es möglich, die Eigenschaft, eine Bohne zu setzen, indem die Eigenschaft eines anderen Bean zu lesen? Zum Beispiel: Angenommen ich hatte:
class A {
void setList(List list);
}
class B {
List getList();
}
Ich möchte Frühling beide Klassen instanziiert und nennen A die Setlist-Methode in dem Ergebnis vorbei B getList Methode aufzurufen. Die Spring-Konfiguration etwas aussehen könnte:
<bean id="b" class="B"/>
<bean id"a" class="A">
<property name="list" ref="b" ref-property="list"/>
</bean>
Ach, diese konfektionierten XML funktioniert nicht.
Warum nicht einfach B in A injiziert? Denn ich will nicht die zusätzliche Abhängigkeit einzuführen. A ist nur abhängig List, nicht auf B.
Lösung
neben @ Kevins Antwort, wenn Sie Feder verwenden 3.0 ist es möglich, dies mit der neuen Federausdruckssprache zu tun
<bean id="a" class="A">
<property name="list"
value="#{b.list}"/>
</bean>
Andere Tipps
Es gibt ein paar Möglichkeiten. Hier ist eine:
<bean id="b" class="B"/>
<bean id="a" class="A">
<property name="list">
<bean class="org.springframework.beans.factory.config.PropertyPathFactoryBean">
<property name="targetObject" ref="b"/>
<property name="propertyPath" value="list"/>
</bean>
</property>
</bean>
Siehe auch die <util:property-path/>
Element
Wenn Sie versuchen, das gleiche für einen Konstruktor zu tun, dann tun.
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg type="javax.sql.DataSource" value="#{jdbc.dataSource}">
</constructor-arg>
</bean>
Hier „jdbc“ ist, wie unten erwähnt, dass hat die Eigenschaft „Datasource“ mit Getter und Setter und initilized wie:
<bean id="jdbc" class="com.la.activator.DataSourceProvider">
<property name="myDataSourcePool" ref="dsPoolService"/>
</bean>