2010-08-09 26 views
16

Hãy nói rằng tôi đã sau mùa xuân config (phiên bản của mùa xuân là 3.0.3):Làm thế nào để tiêm FactoryBean thay vì đối tượng nó tạo ra?

<?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="theFactoryBean" class="wax.MyFactoryBean"/> 

    <bean id="factoryBeanUser" class="wax.FactoryBeanUser"> 
     <!-- what should be placed here?--> 
    </bean> 

</beans> 

Tôi có thể hiện của FactoryBean thực hiện và một số ví dụ khác. Tôi cần Spring để tiêm vào dụ khác FactoryBean, không phải đối tượng mà nó tạo ra.

Có hai cách có thể để giải quyết.

một Thứ nhất, rõ ràng và malfunctional:

<bean id="factoryBeanUser" class="wax.FactoryBeanUser"> 
    <property name="myFactoryBean" ref="&theFactoryBean"/> 
</bean> 

Với mùa xuân cấu hình này ném ngoại lệ sau khi khởi động:

[skipped irrelevant part] 
Caused by: org.xml.sax.SAXParseException: The reference to entity "theFactoryBean" must end with the ';' delimiter. 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174) 
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388) 
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1414) 

tôi tìm thấy giải pháp này Spring: Getting FactoryBean object instead of FactoryBean.getObject(), câu hỏi này được đánh dấu như đã trả lời và bốn người đã bình chọn cho nó. Vì vậy, tôi giả định rằng giải pháp này có thể làm việc, nhưng hiện tại có cái gì đó sai trong mã của tôi.

một Thứ hai, làm việc nhưng vụng về:

public class FactoryBeanUser implements ApplicationContextAware{ 

private MyFactoryBean myFactoryBean; 

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     myFactoryBean = (MyFactoryBean)applicationContext.getBean("&theFactoryBean"); 
    } 
} 

Câu hỏi của tôi là nó có thể làm cho cách tiếp cận đầu tiên chức năng hay tôi nên gắn bó với một cách thứ hai?

+0

Tôi không tin tên tài liệu tham khảo có thể bắt đầu bằng ký hiệu. Tôi sẽ xóa nó và thử lại. Tham chiếu trong trường hợp này cần phải là tên bean của bean nhà máy. – duffymo

+0

@duffymo Nếu bạn đúng thì những người bình chọn cho câu trả lời cho một chủ đề tương tự khác hoàn toàn sai :) Dù sao, nếu tôi thay đổi tên tham chiếu thành tên của bean nhà máy, thì Spring sẽ đưa giá trị 'FactoryBean' tạo ra. Đây thực sự là những gì 'FactoryBean' được tạo ra. – wax

+0

Tôi đoán tôi cũng sẽ học điều gì đó ở đây; Tôi chưa bao giờ làm điều đó. Tôi nghĩ bối cảnh ứng dụng là nhà máy - bạn cần gì khác? – duffymo

Trả lời

14

Dường như trình phân tích cú pháp XML diễn giải dấu và (&) làm khởi đầu của thực thể XML. Bạn có thể thử sử dụng ref="&amp;theFactoryBean".

spring docs không rõ liệu cú pháp này có được phép trong tệp xml hay chỉ với tra cứu có lập trình. Nhưng sau đó cấu hình xml được sử dụng bởi bối cảnh ứng dụng, vì vậy tôi giả định rằng &amp; sẽ hoạt động (mặc dù có vẻ như nó không phải là lựa chọn tốt nhất cho một biểu tượng đặc biệt)

Đây là lý do tôi muốn đề xuất một điều khác - nếu bạn thực sự cần bean nhà máy hơn là sản phẩm của nó, tạo ra một bean khác, không thực hiện FactoryBean, định nghĩa một phương thức createObject() hoặc một cái gì đó tương tự, và sử dụng nó trong tất cả các nhà máy cần nó.

Một sidenote - tham khảo tốt hơn xsd với phiên bản bao gồm:

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

+0

tuyệt vời! nó hoạt động. cảm ơn sự giúp đỡ của bạn. – wax

+0

@wax - chỉ dành cho bản ghi - '&' hoạt động? Hoặc đề nghị thay thế? – Bozho

+1

có, '&' hoạt động. Tôi đã xem xét một điều khác mà bạn đề xuất. Trong ứng dụng thực sự của tôi, tôi đã có định nghĩa 'BeanFactory' cần được sửa đổi một chút để giải quyết vấn đề của tôi. Đó là lý do tại sao tôi nghĩ sẽ tốt hơn nếu sử dụng lại nó hơn là tạo ra một loại đậu khác. – wax

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