2010-02-05 27 views
7

Tôi có một ứng dụng được xây dựng trên Khung công tác Spring sử dụng tệp thuộc tính bên ngoài cho một số thứ như chuỗi máy chủ lưu trữ cơ sở dữ liệu, tên người dùng và mật khẩu để chúng tôi có thể kiểm tra tệp cấu hình vào kho lưu trữ của chúng tôi (nguồn mở) và không thỏa hiệp bảo mật db. Nó cũng là tuyệt vời bởi vì các nhà phát triển có thể giữ bản sao của riêng mình của tập tin này và ứng dụng sẽ tự động sử dụng cấu hình trên hệ thống của họ thay vì phải cấu hình lại bằng tay.Có thể chỉ định tên lớp cho Spring Framework trong một tệp bên ngoài không?

Tôi muốn có thể chỉ định một bean theo cách tương tự. Chúng tôi đang làm việc với một số lớp có thể thay đổi từ nhà phát triển sang nhà phát triển và sẽ tuyệt vời nếu chúng tôi có thể cho phép họ chỉ định thông tin này trong một tệp khác để họ không phải gây rối với tệp cấu hình chính.

Để cung cấp cho bạn một ý tưởng, chúng tôi có một cái gì đó giống như

<property name="url"> 
    <value>${db.host}</value> 
</property> 

đâu db.host được quy định trong tập tin khác. Những gì chúng tôi muốn là một cái gì đó như

<bean name="ourBean" class="${class.weneed}" /> 

Cú pháp trên không thực sự hiệu quả, nhưng điều đó chứng tỏ những gì chúng tôi muốn làm.

Cảm ơn trước!

Chris

Trả lời

7

Bạn có thể sử dụng FactoryBean cho việc này. Ví dụ này là một FactoryBean mà mất lợi thế về khả năng của mùa xuân để đúc một classname đến một đối tượng Class khi tiêm thuộc tính:

public class MyFactoryBean extends AbstractFactoryBean { 

    private Class targetClass; 

    public void setTargetClass(Class targetClass) { 
     this.targetClass = targetClass; 
    } 

    @Override 
    protected Object createInstance() throws Exception { 
     return targetClass.newInstance(); 
    } 

    @Override 
    public Class getObjectType() { 
     return targetClass; 
    } 

} 

Và sau đó:

<bean name="ourBean" class="com.xyz.MyFactoryBean"> 
    <property name="targetClass" value="${class.weneed}"/> 
</bean> 

Bối cảnh mùa xuân bây giờ sẽ có một bean được gọi là ourBean là đối tượng thuộc loại ${class.weneed}

+1

Awesome, đó chính xác là những gì "weneed";) Tôi sẽ xem xét ASAP đó và lấy lại cho bạn. Cảm ơn! –

0

một tùy chọn khác có thể là sử dụng cocoon-spring-configurator, là một phần của khung công tác Cocoon, nhưng có thể được sử dụng cùng với bạn t phụ thuộc vào bất kỳ thứ kén nào khác.
chúng tôi sử dụng điều này cho rất nhiều ứng dụng web của chúng tôi. ý tưởng chung là cấu hình nhà máy đậu dựa trên một runMode.
nó cho phép bạn dễ dàng thay thế/ghi đè lên các thuộc tính, mà còn để ghi đè lên hoàn cảnh đậu hoàn chỉnh.
trường hợp sử dụng phổ biến là xác định các hạt mà ứng dụng của bạn sử dụng và sau đó có thêm một số tệp cấu hình (không bao giờ được kiểm soát nguồn), để ghi đè lên một số bean để thử một số phần của ứng dụng.

0

tôi thấy rằng đậu tạo ra thông qua sự phản ánh không phải là đậu mùa xuân thích hợp (không đăng ký trong bối cảnh mùa xuân và không có tính chất khởi tạo), vì vậy đây là nâng cấp nho nhỏ:

@Override 
protected Object createInstance() throws Exception { 
    AutowireCapableBeabFactory beanFactory = (AutowireCapableBeabFactory) getBeanFactory(); 
    return beanFactory.createBean(this.targetClass); 
} 
Các vấn đề liên quan