2009-10-21 11 views
23

Czy można ustawić właściwość jednego komponentu bean, czytając właściwość innego komponentu bean? Na przykład, załóżmy, że miałem:sprężyna: ustaw właściwość jednego ziarna, czytając właściwość innego fasoli?

class A { 
    void setList(List list); 
} 

class B { 
    List getList(); 
} 

Chciałbym wiosny do wystąpienia obu klas, i wywołać metodę Setlista A w, przekazując w wyniku wywołania metody getlist B. Konfiguracja Spring może wyglądać mniej więcej:

<bean id="b" class="B"/> 
<bean id"a" class="A"> 
    <property name="list" ref="b" ref-property="list"/> 
</bean> 

Niestety, ten wymyślony kod XML nie działa.

Dlaczego po prostu nie wstrzyknąć B do A? Ponieważ nie chcę wprowadzać dodatkowej zależności. Lista A jest zależna, a nie B.

+0

Skoro masz lepszą odpowiedź, należy rozważyć zmianę akceptację? – Thom

Odpowiedz

46

<util:property-path/> oprócz @ odpowiedź Kevina jeśli używasz wiosna 3.0 możliwe jest, aby robić to z nowego języka ekspresji wiosna

<bean id="a" class="A"> 
    <property name="list" 
     value="#{b.list}"/> 
</bean> 

spring 3.0 documentation

+0

słodki, fajnie. Chciałbym użyć wiosny 3. –

+0

Doskonały, dokładnie to, czego potrzebuję! –

+0

Czy istnieje sposób na zachowanie adnotacji w ten sposób bez SPEL? – coderatchet

18

Istnieje kilka sposobów. Oto jeden:

<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> 

także zobaczyć element

2

Jeśli próbujesz zrobić to samo dla konstruktora, zrób to.

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
      <constructor-arg type="javax.sql.DataSource" value="#{jdbc.dataSource}">    
      </constructor-arg> 
</bean> 

Here „JDBC” jest, jak wspomniano poniżej, który ma właściwość „DataSource” z getter i setter i initilized jak:

<bean id="jdbc" class="com.la.activator.DataSourceProvider"> 
    <property name="myDataSourcePool" ref="dsPoolService"/> 
</bean> 
Powiązane problemy