2012-06-12 31 views
11

Có hai định nghĩa cho một bean (có cùng tên và lớp) hợp lệ trong Spring IOC không?Xác định cùng một bean Spring hai lần có cùng tên

Tôi đang có hai tệp định nghĩa bean được bao gồm trong tệp web.xml. Xem mẫu bên dưới.

applicationContext-beans1.xml

<bean name="myWao" 
    class="com.beans.myBean">  
</bean> 

applicationContext-beans2.xml

<bean name="myWao" 
    class="com.beans.myBean">  
</bean> 

Tôi không phải đối mặt với bất kỳ vấn đề cho đến bây giờ. Nhưng, liệu điều này có thể tác động trong môi trường thực tế mà sẽ được đa luồng và phân cụm?

Lưu ý: Cả XMLs được nạp như tôi có thể sử dụng các loại đậu khác được xác định (chỉ một lần) trong cả XMLs

+0

cả hai tệp xml đều thực sự được tải? –

+0

Có. Cả hai đều được tải. – hop

+0

có thể trùng lặp của [bean ghi đè của Spring] (http://stackoverflow.com/questions/5849192/springs-overriding-bean) –

Trả lời

27

Đó là hợp lệ, nhưng bạn sẽ thấy rằng một trong đậu được ghi đè bởi các khác. Bạn sẽ thấy điều này trong nhật ký dưới dạng

Overriding bean definition for... 

Hành vi này cho phép bạn ghi đè định nghĩa bean được cung cấp trước đó. Nó ảnh hưởng đến việc lắp ráp tĩnh của ứng dụng của bạn và không liên quan đến việc phân luồng/phân nhóm như được đề xuất trong câu hỏi của bạn.

Lưu ý rằng DefaultListableBeanFactory cho phép bạn cấu hình hành vi này qua setAllowBeanDefinitionOverriding()

+0

setAllowBeanDefinitionOverriding() cần được thực hiện sớm. Nếu bạn lập trình tạo ngữ cảnh bean, hãy đảm bảo bạn sử dụng một hàm tạo với một tham số làm mới được đặt thành false và sau đó tải kích hoạt "thủ công". Điều này sẽ làm việc ngay cả khi đậu mùa xuân của bạn được trải rộng trên nhiều tệp/ngữ cảnh. Nếu không, nếu bạn kích hoạt tính năng DEBUG-logging, bạn sẽ chỉ thấy các mục nhật ký như 'DEBUG osbfsDefaultListableBeanFactory - Ghi đè định nghĩa bean cho bean 'myBean' với định nghĩa tương đương: thay thế ... [spring/config1.xml]] bằng ... ; được định nghĩa trong ... [spring/config2.xml]] ' –

6

này có giá trị và hữu ích đặc biệt là khi bạn cố gắng để thay đổi việc thực hiện của một bean bên thứ ba (Ý tôi là, nơi bạn không được phép thay đổi thực hiện một bean) và ở đâu bạn cần cung cấp/cấu hình thêm một số thuộc tính (merge) cho bean.

Ghi đè của bean phụ thuộc vào thứ tự của xml mà bạn cung cấp để tạo ApplicationContext thông qua web.xml hoặc độc lập. Định nghĩa bean mới nhất sẽ giành chiến thắng trong trò chơi.

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