2016-03-19 21 views
5

Đ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?

+0

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

+0

@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

+0

'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

Trả lời

0

Sử dụng @Qualifier sẽ bơm hạt với vòng loại đã cho. Bạn có thể đặt tên cho danh sách mà bạn muốn là một bean và điều đó sẽ hoạt động tốt.

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