2012-10-15 22 views
85

Ví dụMùa xuân: Tại sao chúng ta tự động hóa giao diện chứ không phải lớp được triển khai?

interface IA 
{ 
    public void someFunction(); 
} 

@Resource(name="b") 
class B implements IA 
{ 
    public void someFunction() 
    { 
    //busy code block 
    } 
    public void someBfunc() 
    { 
    //doing b things 
    } 
} 

@Resource(name="c") 
class C implements IA 
{ 
    public void someFunction() 
    { 
    //busy code block 
    } 
    public void someCfunc() 
    { 
    //doing C things 
    } 
} 

class MyRunner 
{ 

    @Autowire 
    @Qualifier("b") 
    IA worker; 

    worker.someFunction(); 
} 

Ai đó có thể giải thích điều này với tôi.

  • Lò xo biết loại đa hình nào được sử dụng.
  • Tôi có cần @Qualifier hoặc @Resource không?
  • Tại sao chúng ta tự động hóa giao diện chứ không phải lớp được triển khai?
+7

Bạn tự động tạo giao diện để có thể triển khai * khác * - đó là một trong những điểm mã hóa giao diện chứ không phải lớp. –

+0

Bạn muốn thực hiện một cách khác nhau; Tôi không hiểu câu hỏi. –

+0

Nếu chúng tôi đang nối dây trong giao diện, điều gì xảy ra khi có phương pháp hiển thị mặc định trong lớp Impl mà tôi cần truy cập? Tôi không thể thêm phương thức đó vào giao diện vì giao diện công cộng không thể chứa công cụ sửa đổi mặc định. – JLewkovich

Trả lời

140

Mùa xuân biết loại đa hình nào được sử dụng.

Miễn là chỉ thực hiện một giao diện duy nhất và triển khai được chú thích với @Component khi bật tính năng quét thành phần của Spring, Spring framework có thể tìm ra cặp (giao diện, triển khai). Nếu quét thành phần không được kích hoạt, thì bạn phải định nghĩa bean một cách rõ ràng trong tệp tin application-config.xml của bạn (hoặc tệp cấu hình mùa xuân tương đương).

Tôi có cần @Qualifier hoặc @Resource không?

Khi bạn có nhiều hơn một thực hiện, thì bạn cần phải hội đủ điều kiện mỗi người trong số họ và trong tự động hệ thống dây điện, bạn sẽ cần phải sử dụng @Qualifier chú thích để tiêm việc thực hiện đúng, cùng với @Autowired chú thích. Nếu bạn đang sử dụng @Resource (ngữ nghĩa J2EE), thì bạn nên chỉ định tên bean bằng cách sử dụng thuộc tính name của chú thích này.

Tại sao chúng ta tự động hóa giao diện chứ không phải lớp được triển khai?

Thứ nhất, luôn luôn là cách hay để mã hóa cho giao diện nói chung. Thứ hai, trong trường hợp của mùa xuân, bạn có thể tiêm bất kỳ thực hiện nào trong thời gian chạy. Một trường hợp sử dụng điển hình là để tiêm thực hiện mô hình trong giai đoạn thử nghiệm.

interface IA 
{ 
    public void someFunction(); 
} 


class B implements IA 
{ 
    public void someFunction() 
    { 
    //busy code block 
    } 
    public void someBfunc() 
    { 
    //doing b things 
    } 
} 


class C implements IA 
{ 
    public void someFunction() 
    { 
    //busy code block 
    } 
    public void someCfunc() 
    { 
    //doing C things 
    } 
} 

class MyRunner 
{ 
    @Autowire 
    @Qualifier("b") 
    IA worker; 

    .... 
    worker.someFunction(); 
} 

cấu hình đậu của bạn sẽ trông như thế này:

<bean id="b" class="B" /> 
<bean id="c" class="C" /> 
<bean id="runner" class="MyRunner" /> 

Ngoài ra, nếu bạn kích hoạt quét thành phần trên bao bì nơi đây là hiện tại, sau đó bạn nên đủ điều kiện từng lớp với @Component như sau:

interface IA 
{ 
    public void someFunction(); 
} 

@Component(value="b") 
class B implements IA 
{ 
    public void someFunction() 
    { 
    //busy code block 
    } 
    public void someBfunc() 
    { 
    //doing b things 
    } 
} 


@Component(value="c") 
class C implements IA 
{ 
    public void someFunction() 
    { 
    //busy code block 
    } 
    public void someCfunc() 
    { 
    //doing C things 
    } 
} 

@Component  
class MyRunner 
{ 
    @Autowire 
    @Qualifier("b") 
    IA worker; 

    .... 
    worker.someFunction(); 
} 

Sau đó, worker trong MyRunner sẽ được tiêm với phiên bản loại B.

+0

@stackoverflow Chỉnh sửa câu hỏi sẽ không có ý nghĩa gì, mới mã thuộc về câu trả lời. Nếu không, câu hỏi sẽ không có ý nghĩa, bởi vì nó sẽ tự trả lời. –

+0

Vikdor - vui lòng xem chỉnh sửa. Đó có phải là cách chính xác để chú thích các lớp và đối tượng được tiêm không? – stackoverflow

+1

Vui lòng xem cập nhật của tôi. – Vikdor

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