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?
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
@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
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