2010-06-29 29 views
11

Tôi cố gắng để viết một ValidatorFactory mà sẽ cung cấp cho tôi một validator dựa trên loại của nóđậu có điều kiện sử dụng lò xo

public Validator getNewValidator(ValidatorType type){ 

    switch: 
     case a : new Validator1(); 
     break; 
      case b : new Validator2(); 
     break; 

} 

Tôi muốn viết sử dụng đậu mùa xuân xml nét

tôi có thể sử dụng tiêm phương pháp nhưng nó sẽ cho phép tôi chỉ tạo một đối tượng và phương pháp thực hiện

không nhận bất kỳ đối số nào.

Tôi không muốn sử dụng FactoryBean .. Tôi chỉ tìm kiếm cho dù chúng ta có thể làm điều này bằng mùa xuân xml

định nghĩa bean.

+0

tại sao bạn không muốn sử dụng FactoryBean? –

+0

không có lý do như vậy .. tôi chỉ muốn biết có thể có cách nào để tạo ra điều kiện đậu..just ra khỏi sự tò mò – Shekhar

+0

Đây là chính xác những gì 'FactoryBean' là cho.Đừng chống lại nó :) – skaffman

Trả lời

2

Đối với các trường hợp phức tạp (phức tạp hơn trường hợp bị lộ), Spring JavaConfig có thể là bạn của bạn.

+0

Trước khi downvoting câu trả lời của tôi, xin vui lòng kiểm tra ngày của nó. Spring JavaConfig chưa được phổ biến rộng rãi trong năm 2010. – jplandrain

21

bạn có thể thực hiện tiêm đậu có điều kiện bằng xml đơn giản. Thuộc tính "ref" có thể được kích hoạt bởi các giá trị thuộc tính từ một tệp thuộc tính và do đó tạo các bean có điều kiện tùy thuộc vào các giá trị thuộc tính. Tính năng này không được ghi lại nhưng nó hoạt động hoàn hảo.

<bean id="validatorFactory" class="ValidatorFactory"> 
<property name="validator" ref="${validatorType}" /> 
</bean> 

<bean id="validatorTypeOne" class="Validator1" lazy-init="true" /> 
<bean id="validatorTypeTwo" class="Validator2" lazy-init="true" /> 

Và nội dung của tập tin bất động sản sẽ là:

validatorType = validatorTypeOne

Để sử dụng tập tin bất động sản trong xml của bạn chỉ cần thêm bối cảnh này để phía trên cùng của cấu hình mùa xuân của bạn

<context:property-placeholder location="classpath:app.properties" /> 
+0

Chỉ cần giải thích thêm một chút về cách tôi có thể làm validatorType = validatorTypeOne trong mã XML? – huahsin68

+1

validatorType = validatorTypeOne là nội dung trong tệp thuộc tính và cú pháp $ {validatorType} được mở rộng đến giá trị của thuộc tính trong trường hợp này: validatorTypeOne. Vì điều này trỏ đến một tham chiếu bean id một thể hiện của lớp Validator1 được tạo và gán cho thuộc tính trong ValidatorFactory. Hiểu rồi? – guido

+0

Không, tôi có chút nhầm lẫn về câu lệnh validatorType = validatorTypeOne. Nếu tôi cần nó là validatorTypeTwo thì sao? Và tôi cũng có lỗi cú pháp trên ref = "$ {validatorType}". Tôi cần một số tài liệu tham khảo về điều này ref để tôi có thể hiểu rõ ràng. – huahsin68

0

Bạn sẽ có thể thực hiện việc này:

<bean id="myValidator" factory-bean="validatorFactory" factory-method="getNewValidator" scope="prototype"> 
    <constructor-arg><ref bean="validatorType"/></constructor-arg> 
</bean> 

<bean id="validatorType" ... /> 

Tất nhiên, nó sử dụng cấu hình tự động FactoryBean bên dưới nhưng bạn tránh bất kỳ sự phụ thuộc mùa xuân nào trong mã của bạn.

1

Nếu bạn đang sử dụng chú thích (@Autowired, @Qualifier v.v.) thay vì xml, bạn không thể làm cho đậu có điều kiện hoạt động (ít nhất là ở phiên bản hiện tại 3). Điều này là do @Qualifier không không hỗ trợ biểu thức thông tin

@Qualifier(value="${validatorType}") 

hơn là tại https://stackoverflow.com/a/7813228/418439

1

Tôi đã có một yêu cầu hơi khác nhau. Trong trường hợp của tôi, tôi muốn có mật khẩu được mã hóa trong sản xuất nhưng văn bản thuần tuý trong phát triển. Ngoài ra, tôi không có quyền truy cập vào bean mẹ parentEncoder. Đây là cách tôi quản lý để đạt được điều đó:

<bean id="plainTextPassword" class="org.springframework.security.authentication.encoding.PlaintextPasswordEncoder"/> 
<bean id="shaPassword" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"> 
    <constructor-arg type="int" value="256"/> 
</bean> 

<bean id="parentEncoder" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="targetSource"> 
    <bean class="org.springframework.aop.target.HotSwappableTargetSource"> 
     <constructor-arg ref="${password.encoding}Password"/> 
    </bean> 
    </property> 
</bean> 

Tất nhiên, tôi định nghĩa password.encoding trong một tập tin bất động sản với giá trị có thể là sha hoặc plainText.

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