2012-01-07 41 views
14

Tôi cần tạo đối tượng hoàn chỉnh không có đối số hàm tạo. Một cái gì đó như thế nàybean mùa xuân với giá trị hàm khởi tạo động

Class A { 
    private final int timeOut 
    public A(int timeout) 
    { 
    this.timeOut = timeout; 
    } 
//... 
} 

Tôi muốn Bean này được quản lý mùa xuân, để tôi có thể sử dụng Spring AOP sau.

<bean id="myBean" class="A" singleton="false"> 
</bean> 

Tuy nhiên đậu của tôi cần thời gian chờ để được thông qua như một giá trị năng động - là có một cách để tạo ra một con suối quản lý đậu với giá trị động được injedcted trong các nhà xây dựng?

+0

Bạn có thể quan tâm đến [SPR-7431] (https://jira.springsource.org/browse/SPR-7431). –

Trả lời

25

BeanFactory có một phương pháp getBean(String name, Object... args) đó, theo javadoc, cho phép bạn chỉ định các đối số hàm tạo được sử dụng để ghi đè các đối số của định nghĩa bean. Vì vậy, bạn có thể đặt giá trị mặc định trong tệp bean và sau đó chỉ định giá trị thời gian chạy "thực" khi được yêu cầu, ví dụ:

<bean id="myBean" class="A" scope="prototype"> 
    <constructor-arg value="0"/> <!-- dummy value --> 
</bean> 

và sau đó:

getBean("myBean", myTimeoutValue); 

Tôi đã không cố gắng này bản thân mình, nhưng nó phải làm việc.

P.S. scope="prototype" giờ đây thích hợp hơn là singleton="false", cú pháp không được dùng nữa - nó rõ ràng hơn, nhưng cũng giống như vậy.

+1

làm thế nào nó có thể đạt được với chú thích ...? Tôi có nghĩa là @Autowired @ Parameter1 (giá trị = "xxx", loại = "String") <- như thế này? –

+0

Điều đó có vẻ như cú pháp hoang dã nhưng, nó hoạt động cho tôi. –

+0

@PatrickJeon Điều này có vẻ rất thú vị với tôi. Tuy nhiên, tôi dường như không thể tìm thấy bất kỳ tài liệu nào hỗ trợ điều này, cũng như tôi không biết nên nhập gì. '@ Parameter1' không được nhận dạng. Tôi đang nhận được gợi ý cho cả Hibernate và JUnit, cả hai đều không phù hợp. Bất kỳ con trỏ sẽ được đánh giá cao. –

1

Hai tùy chọn mùa xuân (không ý định chơi chữ) để ghi nhớ:


1. tạo một nhà máy thời gian chờ, và sử dụng như là tham số constructor. Bạn có thể tạo một hạt thực hiện FactoryBean và công việc của nó là tạo các hạt khác. Vì vậy, nếu bạn có thứ gì đó tạo ra muối để mã hóa, bạn có thể có nó trở về từ getObject() một đối tượng EncryptionSalt. Trong trường hợp của bạn, bạn đang muốn tạo ra số nguyên.

Dưới đây là một ví dụ: http://www.java2s.com/Code/Java/Spring/SpringFactoryBeanDemo.htm


2. tạo một bean timeout mà kết thúc tốt đẹp một int đó là tự động thiết lập, và rời khỏi đó trong "nguyên mẫu" nhà nước vì vậy nó tạo ra mỗi khi Thay vì gặp rắc rối khi tạo một nhà máy, đối tượng EncryptionSalt chỉ có thể được khai báo là một bean nguyên mẫu, vì vậy khi nó được tiêm một đối tượng mới được tạo ra mỗi lần. Đặt logic vào hàm tạo hoặc ở một nơi khác.


Nó phần nào phụ thuộc vào giá trị bạn muốn thời gian chờ thực sự là.

+0

Tôi muốn thời gian chờ là một giá trị số nguyên đơn giản. bạn có thể vui lòng cung cấp cho exmaples của cả hai phương pháp bạn đã đề cập ở đây? – Shamik

+0

Tôi đã xây dựng trong câu trả lời của tôi cho bạn. –

1

Làm điều đó một cách rõ ràng:

interface Bean { 
    void setTimeout(int timeout); 
} 

class BeanImpl implements Bean { 
    private int timeout; 

    @Override 
    public void setTimeout(int timeout) { 
     this.timeout = timeout; 
    } 
    ... 
} 

<bean id="bean" class="BeanImpl" scope="prototype"> 
    ... 
    <!-- Nothing about timeout here --> 
    ... 
</bean> 

class Client { 
    private Bean bean; 
    public void setBean(Bean bean) { 
     this.bean = bean; 
    } 
    ... 
    public void methodThatUsesBean() { 
     int timeout = calculateTimeout(); 
     bean.setTimeout(timeout); 
     ... 
    } 
} 
Các vấn đề liên quan