2015-10-22 15 views
5

Tôi đã xem qua số link này giải thích cách có thể thừa kế một bean. Giả sử rằng lớp HelloWorld trong ví dụ này được hiển thị như là một bean sử dụng chú thích @Component, làm thế nào có thể tạo ra một bean khác thừa hưởng bean này? Tôi có thể sử dụng mở rộng để kế thừa bean HelloWorld và thêm @Component vào lớp mới để mở rộng bean hiện có để lộ ra nó như là một bean mới với các tính năng bổ sung?Thừa kế mùa xuân - Chú thích

Trả lời

5

Trước tiên, bạn hãy trừu tượng cấu hình của bạn, mà được thực hiện bằng không đánh dấu nó như @Configuration, như thế này:

// notice there is no annotation here 
public class ParentConfig { 

    @Bean 
    public ParentBean parentBean() { 
     return new ParentBean(); 
    } 

} 

Một sau đó bạn mở rộng nó, như thế này:

@Configuration 
public class ChildConfig extends ParentConfig { 

    @Bean 
    public ChildBean childBean() { 
     return new ChildBean(); 
    } 

} 

Kết quả sẽ giống hệt như khi bạn thực hiện điều này:

@Configuration 
public class FullConfig { 

    @Bean 
    public ParentBean parentBean() { 
     return new ParentBean(); 
    } 

    @Bean 
    public ChildBean childBean() { 
     return new ChildBean(); 
    } 

} 

Chỉnh sửa: trả lời câu hỏi tiếp theo trong nhận xét.

Nếu mùa xuân chọn cả hai lớp, cha mẹ và con, sẽ có vấn đề với hạt nhân bị trùng lặp, do đó, bạn không thể mở rộng nó trực tiếp. Ngay cả khi bạn ghi đè lên phương pháp, các hạt từ siêu lớp cũng sẽ được khởi tạo bởi ParentConfig.

Kể từ lớp cha mẹ của bạn đã được biên soạn, bạn có 2 lựa chọn:

  1. Nói chuyện với tác giả của tầng lớp phụ huynh và vui lòng yêu cầu ông phải thay đổi nó.

  2. Thay đổi gói @ComponentScan.

Để rõ về giải pháp 2:

Nếu lớp cha mẹ là trong gói com.parent.ParentConfig và các lớp con là gói com.child.ChildConfig, quý vị có thể cấu hình các chức năng quét phần để chỉ lớp dướicom.child get nhặt lên.

Bạn có thể chỉ định các gói quét thành phần bằng cách sử dụng chú thích @ComponentScan("com.child") trên tệp cấu hình chính của bạn (nghĩ lớp ứng dụng).

+0

Cảm ơn ESala. Trong trường hợp của tôi, lớp mà tôi đang cố gắng mở rộng là một phần của một cái bình và được định nghĩa với chú thích Thành phần. Tôi muốn tạo một bean mới mở rộng nó và ghi đè lên một phương thức. –

+0

@PunterVicky Tôi đã thêm câu trả lời cho câu hỏi tiếp theo của bạn :) – ESala

+0

Cảm ơn bạn lần nữa, ESala! –

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