2009-10-21 48 views
23

Có thể đặt thuộc tính của một bean bằng cách đọc thuộc tính của một bean khác không? Ví dụ: giả sử tôi có:spring: đặt thuộc tính của một bean bằng cách đọc thuộc tính của bean khác?

class A { 
    void setList(List list); 
} 

class B { 
    List getList(); 
} 

Tôi muốn Spring khởi tạo cả hai lớp và gọi phương thức setList của A, chuyển qua kết quả gọi phương thức getList của B. Cấu hình Spring có thể trông giống như sau:

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

Than ôi, XML trang điểm này không hoạt động.

Tại sao không tiêm B vào A? Bởi vì tôi không muốn giới thiệu thêm sự phụ thuộc. A chỉ là Danh sách phụ thuộc, không phải trên B.

+0

Vì bạn có một câu trả lời tốt hơn, Bạn sẽ cân nhắc thay đổi sự chấp nhận của bạn? – Thom

Trả lời

46

ngoài @ câu trả lời của Kevin nếu bạn đang sử dụng lò xo 3.0 chúng ta có thể làm điều này với mới ngôn ngữ biểu hiện mùa xuân

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

spring 3.0 documentation

+0

ngọt ngào, thật tuyệt. ước gì tôi đã sử dụng mùa xuân 3. –

+0

tuyệt vời đó là chính xác những gì tôi cần! –

+0

Có cách nào để chú thích cách thực hiện điều này mà không có SPEL không? – coderatchet

18

Có một vài cách. Dưới đây là một:

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

Cũng thấy <util:property-path/> yếu tố

2

Nếu bạn đang cố gắng làm tương tự cho một nhà xây dựng thì hãy làm điều này.

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

Here "jdbc" là như đã đề cập dưới đây có tài sản "dataSource" với phương thức getter và setter và initilized như:

<bean id="jdbc" class="com.la.activator.DataSourceProvider"> 
    <property name="myDataSourcePool" ref="dsPoolService"/> 
</bean> 
Các vấn đề liên quan