假设我有以下Spring配置(Spring的版本是3.0.3):
<?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>
Run Code Online (Sandbox Code Playgroud)
我有FactoryBean
实现的实例和一些其他实例.我需要Spring注入其他实例FactoryBean
,而不是它生成的对象.
有两种可能的方法来解决它.
第一个,显而易见且有故障:
<bean id="factoryBeanUser" class="wax.FactoryBeanUser">
<property name="myFactoryBean" ref="&theFactoryBean"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
使用此配置,Spring会在启动时抛出异常:
[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)
Run Code Online (Sandbox Code Playgroud)
我找到了这个解决方案Spring:获取FactoryBean对象而不是FactoryBean.getObject(),这个问题得到了回答,有四个人投了赞成票.所以我假设这个解决方案可能有效,但目前我的代码中有问题.
第二个,工作但很尴尬:
public class FactoryBeanUser implements ApplicationContextAware{
private MyFactoryBean myFactoryBean;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
myFactoryBean = (MyFactoryBean)applicationContext.getBean("&theFactoryBean");
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是有可能使第一种方法起作用,或者我应该坚持第二种方式吗?
Boz*_*zho 16
似乎XML解析器将&符号(&)解释为XML实体的开头.你可以尝试使用ref="&theFactoryBean"
.
在春天文档目前尚不清楚这句法是否允许在一个XML文件,或只与程序上的查找.但是然后应用程序上下文使用了xml配置,所以我认为它&
应该工作(虽然它似乎不是特殊符号的最佳选择)
这就是为什么我建议另一件事 - 如果你真的需要工厂bean而不是它的产品,创建另一个没有实现的bean FactoryBean
,定义一个方法createObject()
或类似的东西,并在需要它的所有工厂中使用它.
附注 - 更好地参考xsd与版本包括:
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
归档时间: |
|
查看次数: |
5138 次 |
最近记录: |