2011-10-31 34 views
7

Sau khi điều tra của mã tôi thấy:Làm thế nào có thể là đậu mùa xuân với phương pháp nhà máy nhưng không có nhà máy?

<bean id="TestBean" class="com.test.checkDate" 
factory-method="getPreviousDate"> 
<constructor-arg value ............. 

............................... 

Làm thế nào nó có thể là có thể? Cảm ơn.

+0

Chính xác bạn có ý nghĩa gì với "không có nhà máy"? Nếu bạn có thể thuật lại câu hỏi, nó có thể giúp nhận được câu trả lời. –

Trả lời

24

Từ docs

các đối số nhà xây dựng quy định trong định nghĩa bean sẽ được sử dụng để vượt qua trong khi đối số cho các nhà xây dựng của ExampleBean. Bây giờ hãy xem xét một biến thể của này, nơi thay vì sử dụng một constructor, Mùa xuân đang nói để gọi một phương thức tĩnh để trở về một thể của đối tượng:

<bean id="exampleBean" class="examples.ExampleBean" 
     factory-method="createInstance"> 
    <constructor-arg ref="anotherExampleBean"/> 
    <constructor-arg ref="yetAnotherBean"/> 
    <constructor-arg value="1"/> 
</bean> 

<bean id="anotherExampleBean" class="examples.AnotherBean"/> 
<bean id="yetAnotherBean" class="examples.YetAnotherBean"/> 

public class ExampleBean { 

    // a private constructor 
    private ExampleBean(...) { 
     ... 
    } 

    // a static factory method; the arguments to this method can be 
    // considered the dependencies of the bean that is returned, 
    // regardless of how those arguments are actually used. 
    public static ExampleBean createInstance (
      AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) { 

     ExampleBean eb = new ExampleBean (...); 
     // some other operations... 
      return eb; 
    } 
} 

Lưu ý rằng các đối số cho phương thức factory tĩnh được cung cấp thông qua các phần tử constructor-arg , giống hệt như nếu một constructor đã thực hiện . Ngoài ra, điều quan trọng là phải nhận ra rằng loại lớp được trả về theo phương pháp của nhà máy không phải là cùng loại với lớp chứa phương pháp nhà máy tĩnh, mặc dù trong ví dụ này. Phương pháp của cá thể (không tĩnh) sẽ được sử dụng theo kiểu cơ bản giống hệt nhau (ngoài việc sử dụng thuộc tính bean của nhà máy thay vì thuộc tính lớp), vì vậy chi tiết sẽ không được thảo luận ở đây.

+1

Cảm ơn ... bạn đã cứu tôi một thời gian quý giá. – Lahniep

1

Điều này đơn giản có nghĩa là com.test.checkDate có phương pháp tĩnh được gọi là getPreviousDate. Nhà máy của bạn tạo các đối tượng là com.test.checkDate. Chúng tôi không biết loại nào là đối tượng được trả lại, không được nói trong cấu hình, có thể là java.util.Date.

định nghĩa không chỉ định loại (lớp) của đối tượng được trả về, chỉ có lớp chứa phương thức nhà máy.

constructor-arg đơn giản được chuyển thành tham số getPreviousDate. Vì phương thức là tĩnh, nó không cần một cá thể của checkDate. Nếu có vẻ thú vị khi sử dụng constructor-arg để gọi một phương thức không phải là một nhà xây dựng về mặt kỹ thuật, hãy nghĩ rằng phương pháp tĩnh thực sự đang xây dựng một đối tượng, vì vậy nó sẽ dễ nhớ hơn.

Vì trong phiên bản trước của câu trả lời bạn đã đề cập "không có nhà máy", có thể bạn đang nghĩ về trường hợp instantiation using an instance factory method, yêu cầu thuộc tính factory-bean, nhưng đây là trường hợp của Instantiation with a static factory method.

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