2010-01-24 24 views
5

Tôi muốn tạo một số hạt đậu mùa xuân sau khi khởi động theo kiểu nhà máy-ish. Ví dụ như thường xuyên như vậy tôi có một số công việc để làm và tôi cần phải tạo một bean nhiệm vụ (có thể có phụ thuộc vào các bean mùa xuân khác) và thực thi nó.Tạo hạt theo yêu cầu bằng cách sử dụng lò xo

Có thể có một vài phần công việc để thực hiện đồng thời do đó mỗi bean nhiệm vụ cần phải độc lập (nguyên mẫu).

Có bất kỳ người mẫu chung nào sử dụng để đạt được điều này không?

Như tôi thấy, tôi cần tương tác với vùng chứa/applicationContext bằng cách nào đó nhưng tôi không thực sự muốn phân tán các tệp applicationContext/beanFactory và gọi tới getBean ("...") ở mọi nơi.

Tôi nghĩ đến một cái gì đó như thế này (lưu ý các "nhà máy" là một cái gì đó tôi tưởng tượng, chứ không phải là cái gì đó tồn tại)

<bean id="myTask" class="MyTask" scope="prototype"> 
    <property name="entityManager" ref=".../> 
    ... 
</bean> 

<bean id="myTaskExecutor" class="MyTaskExecutor"> 
    <property name="taskFactory"> 
    <xxx:factory bean="myTask"/> 
    </property> 
</bean> 

Và sau đó mã

class MyTaskExecutor 
{ 
    private Factory<MyTask> taskFactory; 

    public void setTaskFactory(Factory<MyTask> taskFactory) 
    { 
    this.taskFactory = taskFactory; 
    } 
} 

Và có lẽ một chú thích phiên bản

class MyTaskExecutor 
{ 
    @Factory(MyTask.class) 
    private Factory<MyTask> taskFactory; 

} 

Có thể có điều gì đó giống như trên? Hay tôi thiếu cái gì đó cơ bản ở đâu đó.

Tôi nhận ra mình có thể có một MyTaskFactory đơn và sử dụng nó để khởi tạo bằng cách sử dụng "mới" nhưng sau đó tôi phải vượt qua tất cả những người phụ thuộc của nó từ nhà máy mà cảm thấy sai.

Vì vậy, tôi đoán để tổng hợp các câu hỏi được

cách khuyến khích tạo ra đậu mùa xuân nguyên mẫu theo yêu cầu từ bên trong mã ứng dụng là gì?

Đánh giá cao mọi đầu vào.

Trả lời

4

Tôi nghĩ bạn đang làm quá phức tạp vấn đề. Tất cả những gì bạn cần làm là viết một lớp TaskFactory (không có gì đặc biệt về nó, không có giao diện hoặc chú thích đặc biệt). TaskFactory sẽ được tiêm với tất cả các hạt khác cần thiết, và sẽ có một phương pháp createTask tạo ra các nhiệm vụ theo yêu cầu và chuyển các tham chiếu đến các hạt Spring cần thiết đến nhiệm vụ mới khi nó được tạo ra. Mã máy khách được tiêm TaskFactory và gọi createTask khi được yêu cầu.

Bản thân mùa xuân không hỗ trợ rõ ràng cho những gì bạn đang cố gắng làm. Các sở thích của factory-method Các thuộc tính XML và các giao diện FactoryBean chỉ hữu ích cho việc tạo một bean trong phạm vi của nó và nếu bạn muốn tạo chúng theo yêu cầu, nghĩa là scope="prototype" và điều đó có nghĩa là sử dụng getBean().

chỉnh sửa: Có lẽ đáng để chỉ ra rằng các hạt có vỏ nguyên mẫu thực sự không phải là những gì Spring được thiết kế cho. Có, nó hỗ trợ họ, nhưng sử dụng chúng không phải là một kinh nghiệm rất hiệu quả. Nếu bạn thực sự muốn đi xuống con đường này, thì giá trị đó là taking a look at @Configurable. Nó rất mạnh mẽ, nhưng không phải lúc nào cũng phù hợp, bởi vì các ràng buộc bộ nạp lớp thời gian chạy.

+1

Tôi nhận được những gì bạn đang nói nhưng nó vẫn không cảm thấy giống như một giải pháp tuyệt vời (tôi đã đề cập có một nhà máy ở trên). Hãy xem xét nếu MyTask có sự phụ thuộc vào các hạt cà phê có vỏ nguyên mẫu khác, mỗi hạt có phụ thuộc riêng của chúng. Tôi sẽ phải sản xuất tất cả những người trong nhà máy (và tiêm phụ thuộc vào nhà máy của tôi) và chuyển chúng qua MyTask, hoặc có MyTask tạo ra chúng, và có nhà máy vượt qua tất cả các phụ thuộc của bean nguyên mẫu khác. Đó là tất cả cảm giác giống như không sử dụng lò xo cho người độc thân, chỉ trong trường hợp này, nó là dành cho hạt đậu nguyên mẫu. –

+0

xem chỉnh sửa liên quan đến '@ Configurable' – skaffman

0

Tôi đang cố gắng làm một điều rất giống nhau (Mùa xuân 3.0) cho điều này vì vậy tôi muốn được quan tâm đến việc nghe như thế nào bạn đã kết thúc giải quyết vấn đề này.

Cách tiếp cận hiện tại của tôi là sử dụng getBean() và tôi đã đi với phạm vi singleton mặc định với bean/pojos Spring-instatiated của tôi. Vì vậy, tôi có mã an toàn không phải là chủ đề cho bây giờ nhưng muốn cải thiện nó để được thread an toàn hơn nữa xuống theo dõi.

+0

Tôi đã kết thúc chỉ bằng cách sử dụng BeanFactoryAware trên đậu có liên quan và gọi getBean() khi cần thiết để sản xuất đậu nguyên mẫu của tôi. Tôi chắc rằng một giải pháp chú thích là hoàn toàn khả thi nhưng tôi đã quyết định sẽ là quá mức cần thiết đối với tôi vì tôi chỉ cần chức năng trong khoảng 5-10 địa điểm, trong một ứng dụng rất lớn. –

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