2009-08-12 33 views
5

Tôi đã tạo một bean mùa xuân có chứa một danh sách các loại đậu khác, như vậy:Xuân XML đậu bên trong câu hỏi

<bean name="InventoryManager" class="InvManager"> 
    <property name="slots"> 
    <bean class="HeadSlot" /> 
    <bean class="ShoulderSlot" /> 
    <!-- ... --> 
    </property> 
</bean> 

Vấn đề, tuy nhiên, là ở nơi khác tôi đã sử dụng một chú thích @Autowired trong lớp khác để lấy một danh sách tất cả đậu thực hiện một giao diện chắc chắn rằng một số trong những đậu bên trong thực hiện, như vậy:

@Autowired 
public void registerInventoryHandlers(List<InvSlot> slots) { 
    //... do some setup stuff with beans that implement the InvSlot interface. 
} 

vấn đề ở đây là dường như "đậu bên trong" được định nghĩa trong XML không nằm trong danh sách @Autowired. Tuy nhiên, việc đưa tất cả các tên hạt đậu và sau đó tham khảo chúng từ XML có vẻ không cần thiết và xấu xí.

Có cách nào để xác định một bean bên trong một bean khác, nhưng không phải là bean "bên trong"? Hoặc là có một cách tốt hơn để xử lý thiết kế này?

Trả lời

5

Đậu định nghĩa bên trong hạt cà phê khác, theo định nghĩa, "bên trong" đậu. Các tài liệu nói:

Hạt bên trong luôn ẩn danh và chúng luôn được tạo thành nguyên mẫu. Cũng xin lưu ý rằng không phải là có thể tiêm hạt bên trong vào các hạt cộng tác khác với hạt đậu bao .

đã chỉnh sửa để loại bỏ những thứ mà đã kém nghĩ ra, irrelevent hoặc chỉ đơn giản sai

Tôi đề nghị rằng thay vì autowiring danh sách các InvSlot đậu, bạn autowire mình với đậu InvManager để thay thế. Sau đó, bạn có thể yêu cầu InvManager để biết danh sách các hạt InvSlot, trong khi vẫn giữ danh sách các định nghĩa bean bên trong bên trong định nghĩa InvManager.

+0

Ah, ngược lại! @Autowired có một số ứng dụng đáng ngạc nhiên, ít được biết đến hơn. Để trích dẫn tài liệu của Spring: "Cũng có thể cung cấp tất cả các loại hạt của một loại cụ thể từ ApplicationContext bằng cách thêm chú thích vào một trường hoặc phương thức dự kiến ​​một mảng thuộc loại" –

+0

địa ngục đẫm máu ". Tôi cảm ơn bạn, bạn đã dạy tôi một điều mới :) – skaffman

+0

Tôi đã cố gắng sử dụng nó để cấp nguồn cho một loại "không cần phải đăng ký cho mình" hàng đợi sự kiện và nghĩ mình đẫm máu thông minh. Nhưng rồi tôi chạy vào cái giun đặc biệt này. –

0

Tôi nhận thấy rằng việc sử dụng @Component hoạt động rất độc đáo.

@Component class InvManager { 
    ... 
    @Autowired 
    public void registerInventoryHandlers(List<InvSlot> slots) { ... } 
} 

@Component class HeadSlot implements InvSlot { ... } 

@Component class ShoulderSlot implements InvSlot { ... } 

cấu hình của bạn trở nên

<context:component-scan base-package="com.foo.bar"/> 
Các vấn đề liên quan