2012-08-06 39 views
8

Giả sử tôi có hai mô-đun. Một là cốt lõi và một là mô-đun thực hiện phụ thuộc cốt lõi. Core là tệp jar cho chiến dịch mô-đun phụ thuộc triển khai đó.ghi đè cấu hình bean vào mùa xuân

Trong lõi Tôi có một bean định nghĩa như thế

<bean id="x" class="com.pokuri.X"> 
<property name="y" ref="y"/> 
<property name="z" ref="z"/> 
</bean> 

Và lớp mà có một phương pháp như sau

public class X{ 

    public void doSomeJob(){ 
    ....... 
    } 

} 

phương pháp này đã được gọi từ một số lớp lõi. Bây giờ tôi cần phải thay đổi logic trong phương thức doSomeJob() của X đó theo cách thực hiện phụ thuộc cốt lõi của tôi. Vì vậy, tôi tạo một lớp học như thế này

public class ExtX extends X{ 

    @override 
    public void doSomeJob(){ 
    // changed logic 
    } 

} 

và xác định bean có cùng id trong một tệp xml ngữ cảnh ứng dụng khác như thế này.

<bean id="x" class="com.pokuri.ExtX"> 
    <property name="y" ref="y"/> 
    <property name="z" ref="z"/> 
</bean> 

và chúng tôi đang xây dựng bối cảnh ứng dụng sử dụng tham số contextConfigLocation bối cảnh trong web.xml xác định giá trị như classpath:springfolder.

Nhưng trong logic lõi, tôi chỉ nhận được cá thể bean lõi (ví dụ: X thể hiện) không ExtX. Làm thế nào chúng ta có thể ghi đè lên định nghĩa bean đó và để cho hệ thống bắt đầu sử dụng định nghĩa bean mở rộng mới?

Và tôi nghe nói rằng với cùng một ID trong các tệp ngữ cảnh ứng dụng khác nhau sẽ ghi đè định nghĩa bean được tải đầu tiên với định nghĩa bean được tải sau này. Có bất kỳ loại thuộc tính priority nào trên định nghĩa bean để cho phép ApplicationContext sử dụng ưu tiên cao nhất để xem xét ưu tiên thấp hơn khi các bean có cùng ID được tìm thấy.

Trả lời

12

Một cách ghi đè định nghĩa bean là những gì bạn đã chỉ ra - để xác định nó với cùng một id nhiều lần và định nghĩa bean cuối cùng có cùng id là giá trị có hiệu lực. Vì vậy, nếu bạn đảm bảo rằng ExtX là bản cuối cùng được tải lên, nó chỉ hoạt động và để đảm bảo điều này bạn có thể thực hiện việc này trong tệp chiến tranh của mình thay vì tải lên bằng cách nói classpath:springfolder, bạn có thể nhập cấu hình cốt lõi trong Mùa xuân của chiến tranh của bạn tệp cấu hình và sau đó ghi đè lên bean theo cách này:

<import resource="core-resource.xml"/> 
<bean id="x" class="com.pokuri.ExtX"> 
    <property name="y" ref="y"/> 
    <property name="z" ref="z"/> 
</bean> 

Điều này sẽ đảm bảo rằng bean được ghi đè của bạn là bean có hiệu lực.

Không có trường ưu tiên/thứ tự mà bạn có thể sử dụng ở đây - nếu bạn muốn bạn có thể tải tất cả các định nghĩa bean của một loại bằng cách cung cấp Map<String,X> làm tham số và sắp xếp nó bằng cách mong đợi một thuộc tính và sử dụng đơn đặt hàng theo cách đó, nhưng có nhiều việc hơn cho nó.

Một cách tiếp cận thứ hai được mô tả ở đây: Overriding the bean defined in parent context in a child context

+0

Sẽ cố gắng tiếp cận của bạn – Pokuri

+0

Tất nhiên nó hoạt động. Nhưng thực hành tốt có bao gồm một định nghĩa của một định nghĩa khác không? Tôi nghĩ đó là loại hack: / –

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