Điều gì làm việc
Giả sử tôi có một định nghĩa bean mùa xuân của một ArrayList:Làm thế nào tôi có thể tiêm một thể hiện của danh sách trong mùa xuân?
<bean id="availableLanguages" class="java.util.ArrayList">
<constructor-arg>
<bean class="java.util.Arrays" factory-method="asList">
<constructor-arg>
<list>
<value>de</value>
<value>en</value>
</list>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
Bây giờ tôi có thể tiêm này vào tất cả các loại đậu, ví dụ như thế này:
@Controller
class Controller {
@Autowired
public Controller(ArrayList<String> availableLanguages) {
// ...
}
}
Điều này thật tuyệt vời.
Làm thế nào nó phá vỡ
Tuy nhiên nếu tôi thay đổi điều khiển của tôi một chút và sử dụng các loại List
thay vì ArrayList
như thế này:
@Controller
class Controller {
@Autowired
public Controller(List<String> availableLanguages) {
// ...
}
}
Sau đó, thay vào đó tôi nhận được một danh sách tất cả đậu kiểu String
thay vào đó là đậu tôi đã xác định. Tuy nhiên, tôi thực sự muốn đưa Danh sách của mình vào Danh sách không thể sửa đổi, nhưng điều này chỉ có thể xảy ra nếu tôi hạ cấp sự phụ thuộc của tôi vào một danh sách.
Cho đến nay đã phát hiện ra cách giải quyết
Tệp sau XML:
<bean id="availableLanguages" class="java.util.Collections" factory-method="unmodifiableList">
<constructor-arg>
<bean class="java.util.Arrays" factory-method="asList">
<constructor-arg>
<list>
<value>de</value>
<value>en</value>
</list>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
làm việc cùng với bộ điều khiển này:
@Controller
class Controller {
@Autowired
public Controller(Object availableLanguages) {
List<String> theList = (List<String>)availableLanguages;
}
}
Trong khi các công trình này loại thêm dàn diễn viên là xấu xí.
phát hiện cho đến nay
I figured rằng có một special handling for collections in Spring 4.2.5 (the currently most recent version) mà dường như gây ra tất cả những rắc rối. Nó tạo ra hành vi đặc biệt khi tham số là một giao diện mở rộng Collection
. Vì vậy, tôi có thể giải quyết bằng cách sử dụng Object
hoặc triển khai cụ thể dưới dạng kiểu tham số.
Câu hỏi
Có cách nào trực tiếp đưa danh sách vào đậu không? Làm sao?
Bạn có thể sử dụng không gian tên 'util'. Hãy xem [this] (http://stackoverflow.com/questions/2416056/how-to-define-a-list-bean-in-spring) asnwer. – josivan
@josivan: Theo như tôi thấy điều này sẽ thay đổi cách tôi định nghĩa danh sách. Tuy nhiên định nghĩa của danh sách không phải là vấn đề. Đó là tiêm gây ra vấn đề hoặc tôi thiếu bất cứ điều gì về những gì 'util' không? – yankee
'util: list' là một bean thông thường trong bối cảnh Spring, bạn có thể tiêm nó bình thường. Tôi nhận thấy rằng bạn có một kết hợp của Annotation và XML, sau đó là khay để sử dụng '@ Qualifier' trong hàm tạo. Ví dụ '@Qualifier (" myList ")' – josivan