2012-02-03 27 views
10
<bean id="Mybean" class="Bean"> 
    <property name="config" ref="dev"/> 
</bean> 

<bean id="dev" class="Dev"> 
    <property name="x" ref="Dev1"> 
    <property name="y" ref="Dev2"> 
    <property name="z" ref="Dev3"> 
</bean> 

<bean id="stag" class="Dev"> 
    <property name="x" ref="Stag1"> 
    <property name="y" ref="Stag2"> 
    <property name="z" ref="Stag3"> 
</bean> 

Trong trường hợp trên, thuộc tính config trong bean MyBean thay đổi từ môi trường sang môi trường. Tại thời điểm dev, tham chiếu về thay đổi cấu hình thành dev. Và trong dàn dựng, thay đổi tham chiếu đến stag. Vấn đề xảy ra tại thời điểm kiểm tra trong tập tin mùa xuân. Chúng tôi phải phân tích mọi tham chiếu của cấu hình trước khi đăng ký. Nếu tham chiếu về cấu hình với giá trị dev đã đăng ký, chúng tôi có thể phải giải thích rất nhiều câu hỏi.Làm thế nào để thiết lập một tham chiếu bean động trong Spring?

Có giải pháp nào để giải quyết để làm cho nó tự động hóa không?
Lưu ý: Phiên bản mùa xuân là 2.0.1

+0

Không có thứ gì như Spring 2.1. Có 2.0 và 2.5. Ý bạn là 3.1? – skaffman

+0

Bạn đang sử dụng Maven? –

Trả lời

9

Sử dụng PropertyPlaceholderConfigurer từ mùa xuân, và loại bỏ một hạt đậu không sử dụng:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location"> 
     <value>env.properties</value> 
    </property> 
</bean> 

<bean id="Mybean" class="Bean"> 
    <property name="config" ref="config"/> 
</bean> 

<bean id="config" class="Config"> 
    <property name="x" ref="${x}"> 
    <property name="y" ref="${y}"> 
    <property name="z" ref="${z}"> 
</bean> 

và file env.properties chứa các thuộc tính sau:

x=Dev1 
y=Dev2 
z=Dev3 

hoặc

x=Stag1 
y=Stag2 
z=Stag3 
1

Mùa xuân cung cấp cơ chế được gọi là trình giữ chỗ thuộc tính. Bằng cách này bạn có thể thiết lập các thuộc tính nhất định trong một tệp cơ sở dữ liệu/thuộc tính và mùa xuân sẽ điền chúng vào khi khởi động.

Lớp học sử dụng cho mục đích này là here.

+0

Giải pháp không hoạt động..Đó là đưa ra lỗi rằng bean có tên {dev} không được định nghĩa .. Bất kỳ trợ giúp nào ?? – Shashi

2

Bạn có thể làm điều đó bằng PropertyPlaceholderConfigurer hoặc sử dụng @Profile

Ngoài Xem

+1

@ShashiBhushan: [PropertyPlaceholderConfigurer] (http://static.springsource.org/spring/docs/1.0.0/api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html) đã có trong Spring từ 1.0. – beny23

+0

Lỗi cho rằng bean có tên {dev} không được định nghĩa .. Bất kỳ Trợ giúp nào .. Có thể là PropertyPlaceholderConfigure được sử dụng để cung cấp giá trị "động", chứ không phải là "ref" động. Shashi

+1

Bạn quên "$": 'ref =" $ {dev} "' –

3

Giả sử bạn có nghĩa là mùa xuân 3.1, chứ không phải là mùa xuân 2.1 (mà không tồn tại), sau đó bạn có thể sử dụng "En mới vironment Profiles "tính năng đã được giới thiệu trong 3.1. Điều này cho phép bạn xác định một tập hợp các bean cho mỗi môi trường của bạn, và sau đó chọn một "hoạt động" trong thời gian chạy.

Xem ví dụ này SpringSource Blog Entry để biết ví dụ.

4
  1. thiết lập lên đậu giữ chỗ bởi specfiy, chúng ta hãy mùa xuân biết bạn muốn giữ chỗ
  2. thiết lập cấu hình cho "đậu của tôi" bằng "$ {env}"

cho Ví dụ:

<beans> 
<bean id="configBean" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
      <property name="location"><value>env.properties</value></property> 
</bean> 

<bean id="Mybean" class="Bean"> 
    <property name="config" ref="${env}"/> 
</bean> 

</beans> 

và bạn cần thêm env = dev khóa-giá trị các env.properties nộp

2

PropertyPlaceholderConfigurer là câu trả lời , nhưng tôi sẽ tưởng tượng rằng bạn muốn điều này xảy ra mà không cần phải cập nhật tệp thuộc tính của bạn cho từng môi trường.do đó

Đề nghị của tôi sẽ như sau

  1. Sử dụng PropertyPlaceholderConfigurer, nhưng không tạo ra một thuộc tính tập tin
  2. Theo mặc định, PropertyPlaceholderConfigurer cố gắng đầu tiên để tìm một giá trị trong một thuộc tính tập tin, nhưng nếu thất bại, nó sẽ tìm kiếm một trong system properties

vì vậy, tất cả các bạn cần làm là để xác định cả đậu cùng một cách mà bạn đang làm việc đó, tức là devstag .. đó là một cách tiếp cận tốt vì bạn đang hiển thị rõ ràng các cấu hình khác nhau ... nó sẽ giúp ích nếu bạn cũng thêm một số bí danh để hiển thị rõ ràng cài đặt bạn muốn sử dụng.

Tiếp theo, chuyển vào thuộc tính hệ thống xác định chế độ bạn đang ở ... và lý tưởng đặt rõ ràng PropertyPlaceholderConfigurer để sử dụng Thuộc tính hệ thống.

Vì vậy .. cấu hình của bạn sẽ trông như thế này

<bean 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"  
    systemPropertiesMode="2"/> 

<bean id="Mybean" class="Bean"> 
    <property name="config" ref="${launch.mode}"/> 
</bean> 

<bean id="dev" name="dev_mode" class="Dev"> 
    <property name="x" ref="Dev1"> 
    <property name="y" ref="Dev2"> 
    <property name="z" ref="Dev3"> 
</bean> 

<bean id="stag" name="staging_mode" class="Dev"> 
    <property name="x" ref="Stag1"> 
    <property name="y" ref="Stag2"> 
    <property name="z" ref="Stag3"> 
</bean> 

Sau đó bạn có thể vượt qua trong bất động sản khi khởi động trong thời trang sau

-D<property-name>=<value> 

Vì vậy, trong trường hợp này bạn muốn sử dụng

-Dlaunch.mode=dev_mode 

Hoặc

-Dlaunch.mode=staging_mode 

Và bạn sẽ không cần phải chạm vào bất kỳ tệp cấu hình nào.

Chỉ cần một lưu ý thêm về systemPropertiesMode, các giá trị được chấp nhận như sau:

  • 0 - không bao giờ nhìn vào thuộc tính hệ thống
  • 1 - thuộc tính hệ thống sử dụng như một dự phòng (tức là nếu không tìm thấy trong các tập tin thuộc tính)
  • 2 - thuộc tính hệ thống luôn ghi đè lên (chế độ tôi đang đề nghị)

Hy vọng nó sẽ giúp :)

Lưu ý: Đề xuất này chỉ áp dụng cho Spring < 3.1, kể từ từ 3.1 trở đi, cách tiếp cận được khuyến nghị là sử dụng @Profile

Các vấn đề liên quan