2012-05-15 26 views
7

Giả sử rằng tôi có một lớp với một hàm tạo có một hoặc nhiều đối số. Cũng hãy nói rằng các đối số được mong đợi là loại đầu vào từ người dùng. I.e các đối số không thể được biết tại thời gian biên dịch hoặc cấu hình thời gian, chỉ khi chạy. Tôi có nên định nghĩa lớp của mình là một bean mùa xuân nguyên mẫu hay tôi nên tạo nó bằng "mới".Constructor lấy đối số - Xác định đối tượng thông thường hoặc bean mùa xuân?

Nếu tôi định nghĩa nó là một bean, làm thế nào tôi có thể vượt qua trong các đối số?

Trả lời

7

Đây là vấn đề trong mùa xuân. Nếu lớp học của bạn không phụ thuộc vào các hạt khác, chỉ cần tạo nó với new. Nếu bạn có một lớp tùy thuộc vào các Spring bean khác nhưng bạn vẫn muốn truyền một số đối số thời gian chạy, hiện tại Spring không hỗ trợ nó.

Tuy nhiên, hãy xem SPR-7431my article about passing custom argument to <lookup-methods/>. Nếu mọi việc suôn sẻ, tính năng này phải là một phần của Spring 3.2 và nó phải phù hợp với yêu cầu của bạn. Về cơ bản nó cho phép tạo ra các hạt đậu prototype trong khi vẫn truyền một số đối số hàm tạo.

+0

Thông tin rất tốt và tốt đẹp. Cảm ơn –

+0

Cập nhật: Tính năng này KHÔNG phải là một phần của mùa xuân. – javadeveloper

+0

có được hỗ trợ trong Spring 4 ngay bây giờ không? –

5

Trừ khi lớp học của bạn cũng có phụ thuộc vào các hạt khác trong ngữ cảnh của bạn, sau đó không, bạn không nên làm cho nó là một bean - không có điểm. Chỉ cần sử dụng new.

Lý do thuyết phục duy nhất để làm cho nó là một hạt là nếu nó không phụ thuộc vào các loại đậu khác, trong trường hợp đó một hạt đậu nguyên mẫu là hợp lý. Tuy nhiên, nếu lớp đòi hỏi các giá trị thời gian chạy trong hàm khởi tạo của nó, thì bạn không thể thực sự làm điều đó, thiếu thay đổi lớp để tiêm chúng thông qua một số phương thức thay vì sử dụng hàm tạo.

+0

Vâng .. đối tượng tôi muốn tạo được thực sự phải trở lại mùa xuân Đậu tại một trong những phương pháp của nó nên nó _does_ phụ thuộc vào chúng. Nhưng nếu nó không thể được thực hiện, sau đó nó không thể được thực hiện ... –

+0

@LudwigMagnusson: Tôi đề nghị tái cấu trúc lớp, sau đó, để các giá trị thời gian chạy của bạn được chuyển vào phương thức mà sau đó trả về bean thích hợp, thay vì chuyển chúng vào hàm tạo. – skaffman

+0

Điều đó là không thể. Lớp thực hiện một giao diện xác định phương thức và nó không thể lấy các đối số vì các lớp thực hiện được cho là có khả năng tạo ra các bean từ các kiểu đầu vào khác nhau. Nhưng có lẽ nếu tôi suy nghĩ sâu hơn về điều này, tôi có thể cấu trúc lại nó theo cách như vậy ... –

0

mùa xuân-tính năng của đối số đường chuyền qua constructor sử dụng công tra cứu-method doesnt vào mùa xuân 3.2.11, nhưng đang làm việc trong phiên bản mùa xuân 4.1.1

đây là đoạn code tôi sử dụng để kiểm tra xem nó:

đây là nhà máy giao diện ...

package prueba; 

public interface Factory { 

    Person createPersonWithDependencies(String name); 
} 

đây là đậu chúng ta muốn được quản lý bởi mùa xuân, tiêm helloWorldService ...

package prueba; 

public class Person { 

    private HelloWorldService helloWorldService; 

    public final void setHelloWorldService(HelloWorldService extraService) { 
     this.helloWorldService = extraService; 
    } 

    public Person() { 
     super(); 
    } 

    public Person(String name) { 
     super(); 
     this.name = name; 
    } 

    private String name; 

    public final String sayHello() { 
     return helloWorldService.getGreeting()+" I am "+name; 
    } 
} 

này là dịch vụ helloworld nổi tiếng:

package prueba; 

public class HelloWorldService { 

    public String getGreeting(){ 
     return "hello world"; 
    } 
} 

đây là một dịch vụ ví dụ sử dụng Nhà máy

package prueba; 

public class Service { 

    private Factory factory; 

    public final void setFactory(Factory factory) { 
     this.factory = factory; 
    } 


    public void doSomeThing(){ 
     Person bean1= factory.createPersonWithDependencies("Jhon"); 

     System.out.println(bean1.sayHello()); 

     Person bean2= factory.createPersonWithDependencies("Maria"); 

     System.out.println(bean2.sayHello()); 
     System.out.println(bean1.sayHello()); 

    } 
} 

này là lớp chính mà kiểm tra tất cả các

package prueba; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class TestLookupMethodWithArguments { 
    /** 
    * Main method. 
    */ 
    public static void main(String[] args) { 

     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationContext.xml"); 

     Service service=applicationContext.getBean("service",Service.class); 

     service.doSomeThing(); 
    } 

} 

và cuối cùng tệp cấu hình mùa xuân:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="helloWorldService" class="prueba.HelloWorldService" /> 

    <bean id="Person" class="prueba.Person" scope="prototype"> 
     <property name="helloWorldService" ref="helloWorldService" /> 
    </bean> 

    <bean id="myFactory" class="prueba.Factory"> 
     <lookup-method name="createPersonWithDependencies" bean="Person" /> 
    </bean> 

    <bean id="service" class="prueba.Service"> 
     <property name="factory" ref="myFactory" /> 
    </bean> 
</beans> 

đầu ra sử dụng vào mùa xuân 4.1.1

hello world I am Jhon 
hello world I am Maria 
hello world I am Jhon 
Các vấn đề liên quan