2014-10-23 13 views
5

Giả sử rằng trong tệp ngữ cảnh mùa xuân của bạn, bạn đã nhập một số tệp ngữ cảnh mà bạn không thể sửa đổi.Mùa xuân - Đặt thuộc tính trên các hạt được nhập từ tệp ngữ cảnh khác

Có cách nào để đặt thuộc tính của hạt được nhập không? Tôi không muốn sao chép và dán định nghĩa bean từ các tệp ngữ cảnh đã nhập và sửa đổi nó vì điều này sẽ tạo ra sự phụ thuộc sai giữa mã của tôi và thư viện bên ngoài.

Tôi chỉ cần sửa đổi một thuộc tính của một bean hiện có. Nó có thể là có thể trong lý thuyết cho rằng tôi có thể làm điều đó bằng cách sử dụng một lớp tùy chỉnh nhận đậu để cập nhật như là một phụ thuộc và sửa đổi các thuộc tính của nó trong phương pháp init.

Tôi tự hỏi nếu có cú pháp chuẩn trong Spring để thực hiện điều đó.

Ví dụ trong thư viện-context.xml có định nghĩa bean sau:

<bean id="the.message" class="com.someco.SomeClass"> 
    <property name="message" value="default message" /> 
</bean> 

tôi nhập khẩu này như là một sự phụ thuộc bên ngoài và vì vậy tôi không có tùy chọn để thay đổi định nghĩa này.

Tất nhiên tôi có thể sao chép và dán định nghĩa này trong ngữ cảnh của mình và ghi đè nó. Điều này sẽ là ok với một chiếc đậu giống như một trong ví dụ đó là rất đơn giản. Vấn đề là thường phụ thuộc phức tạp hơn nhiều và chúng có thể thay đổi trong một phiên bản khác của thư viện.

Điều tôi muốn là đặt thuộc tính của bean "the.message" bỏ qua tất cả các chi tiết khác.

Tôi đang suy nghĩ để sử dụng một cái gì đó như:

<bean id="myproxy" class="com.myapp.Proxy" init-method="copyProperties"> 
    <property name="proxied" value="the.message" /> 
    <property name="message" value="my message" /> 
</bean> 

này "proxy" chỉ được sử dụng để thiết lập các thuộc tính của "the.message".

+0

thể trùng lặp của [Tôi có thể thay thế một Định nghĩa bean mùa xuân khi chạy?] (Http://stackoverflow.com/questions/4041300/can-i-replace-a-spring-bean-definition-at-runtime) –

+5

Nó không thấy m cùng một vấn đề. Tôi không muốn thay đổi nó khi chạy. Tôi chỉ cần đặt thuộc tính trong tệp ngữ cảnh của mình. –

Trả lời

0

Để thực hiện những gì bạn muốn làm, SomeClass sẽ cần phải có một setter. Bạn sẽ chỉ tiêm đậu như bình thường và sử dụng setter đó. Nó sẽ dễ dàng hơn bằng cách sử dụng chú thích nhưng có thể thực hiện được với XML.

Tuy nhiên, hãy đảm bảo bạn nhận ra rằng thực hiện điều này sẽ thay đổi giá trị của bean trên toàn cầu. Nếu bất cứ điều gì phụ thuộc vào giá trị ban đầu, điều đó sẽ không còn tồn tại nữa.

0

Tôi tin rằng điều này có thể được thực hiện bằng cách sử dụng org.springframework.beans.factory.config.MethodInvokingFactoryBean trong tệp ngữ cảnh nhập của bạn.

Sử dụng định nghĩa nhập khẩu từ ví dụ của bạn:

<bean id="the.message" class="com.someco.SomeClass"> 

nhắn có thể được thiết lập trong file bối cảnh nhập khẩu như thế này:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="the.message" /> 
    <property name="targetMethod" value="setMessage" /> 
    <property name="arguments"> 
     <list> 
      <value type="java.lang.String">This message was set in importing context file</value> 
     </list> 
    </property> 
</bean> 
Các vấn đề liên quan