2013-08-26 41 views
16

Tôi đang cố gắng đưa một bean java.util.prefs.Preferences vào bộ điều khiển chính của mình. Bộ điều khiển trông giống như:Cách chèn Spring Bean cho phương thức factory yêu cầu tham số MyClass.class

@Controller 
class MyController { 
    @Autowired 
    private Preferences preferences; 
} 

Tệp application-context.xml tạo bean cho java.util.prefs.Preferences. Nó sử dụng phương pháp nhà máy để tôi có mục nhập sau để tạo bean:

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" /> 

Preferences.userNodeForPackage (param) lấy tham số lớp liên quan đến Sở thích. Trong trường hợp này, Spring cần tạo bean bằng cách thực hiện cuộc gọi:

Preferences.userNodeForPackage(MyController.class); 

Làm thế nào để một lớp học được đậu vào lò xo theo phương pháp nhà máy? Cảm ơn

thông tin môi trường:

Java 7 
Spring 3.1 

Trả lời

22

Bạn có thể chỉ định constructor-arg yếu tố

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage"> 
    <constructor-arg type="java.lang.Class" value="com.path.MyController" /> 
</bean> 

này được giải thích trong tài liệu chính thức here, phần 5.4.1.

Các đối số cho phương pháp nhà máy tĩnh được cung cấp qua các yếu tố , chính xác như khi một nhà xây dựng đã sử dụng . Loại của lớp được trả về bởi phương pháp nhà máy không nhất thiết phải cùng loại với lớp mà chứa phương pháp nhà máy tĩnh, mặc dù trong ví dụ này. Phương pháp nhà máy thể hiện (không tĩnh) sẽ được sử dụng theo kiểu cơ bản là (ngoài việc sử dụng thuộc tính bean 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 tại đây.

+0

Ông cần phải cung cấp luận cứ như tham số cho 'userNodeForPackage()' phương pháp, không constructor của 'Preferences' –

+2

@NandkumarTekale Đọc báo giá và tài liệu. Đó là cách bạn làm điều đó khi bạn đã chỉ định thuộc tính 'factory-method'. –

+0

+1 tốt nhất. :) –

2
public class Preferences 
{ 
    SomeBean someBean; 

    public void setSomeBean(SomeBean someBean){ 
      this.someBean = someBean; 
    } 

    public static Preferences createSampleBeanWithIntValue(SomeBean someBean) 
    { 
     Preferences preferences= new Preferences(); 
     preferences.setSomeBean(someBean); 
     return preferences; 
    } 
} 

    <bean id="someBean" class="java.util.prefs.SomeBean"/> 

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" > 

    <constructor-arg ref="someBean "/>  
</bean> 

Xin vui lòng xem các tài liệu tham khảo

http://www.skorks.com/2008/10/are-you-using-the-full-power-of-spring-when-injecting-your-dependencies/

-1

Bạn có thể thử làm "sở thích" một tài sản của "MyController". Một cái gì đó như

<bean id="MyController" class="com.your.package.MyController"> 
    <property name="preferences" ref="preferences" /> 
</bean> 

và sau đó có phương thức getter và setter cho các tùy chọn trong MyController.

Tôi nghĩ điều này sẽ hiệu quả.

+1

Vấn đề của OP không phải là autowiring đối tượng. Vấn đề là xác định và đối số cho một phương pháp nhà máy tĩnh. –

3

Tôi không biết cách cấu hình dựa trên xml nhưng tôi có thể cho bạn biết cách bạn có thể nhanh chóng thực hiện nó qua lớp Configuration.

@Configuration 
public class Config { 
    @Bean(name="preferences") 
    public java.util.prefs.Preferences preferences() { 
     // init 
     return java.util.prefs.Preferences.userNodeForPackage(YourExpectedClass.class); 
    } 
} 

P.S. :

Bạn sẽ cần phải thêm lớp/gói cấu hình để quét trong web.xml nếu bạn đang sử dụng hoàn chỉnh chú thích cách tiếp cận dựa [contextClass=org.springframework.web.context.support.AnnotationConfigWebApplicationContext] hoặc trong tập tin cấu hình của bạn như sau:

<context:component-scan base-package="com.comp.prod.conf" /> 
+0

+1 mắt cho một mắt: p –

+0

+1 Có lẽ nên đề cập đến trong câu trả lời của bạn nó xuất phát từ hiện vật bối cảnh mùa xuân trong Maven. –

0

đầu tiên tạo ra các hạt của lớp 'Preferences' hoặc sử dụng tập tin xml hoặc sử dụng chú thích.
sau đó bạn có thể sử dụng <context:annotation-config> này nếu bạn đã tạo đậu sử dụng cấu hình xml để kích hoạt các chức năng chú thích @Autowired
(hoặc)

<context:component-scan base-package="com.estudo.controller" />
nếu bạn đã tạo đậu sử dụng chú thích.
Lưu ý: xác định các thẻ ở trên trong tệp servlet mùa xuân xml

0

Khung công tác Spring cung cấp phương tiện để tiêm đậu bằng phương pháp nhà máy. Để làm như vậy, chúng ta có thể sử dụng hai thuộc tính của phần tử bean.

phương thức nhà máy: thể hiện phương pháp nhà máy sẽ được gọi để tiêm đậu. nhà máy-bean: đại diện cho các tài liệu tham khảo của đậu mà theo đó phương pháp nhà máy sẽ được gọi. Nó được sử dụng nếu phương pháp nhà máy là không tĩnh. Một phương thức trả về cá thể của một lớp được gọi là phương thức factory.

public class A { 
public static A getA(){//factory method 
    return new A(); 
} 
}