gpt4 book ai didi

java - 如何注入(inject) FactoryBean 而不是它产生的对象?

转载 作者:IT老高 更新时间:2023-10-28 13:52:09 26 4
gpt4 key购买 nike

假设我有以下 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>

我有 FactoryBean 实现的实例和其他一些实例。我需要 Spring 注入(inject)到其他实例 FactoryBean,而不是它产生的对象。

有两种可能的方法来解决它。

第一个,明显且故障:

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

有了这个配置,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)

我找到了这个解决方案 Spring: Getting FactoryBean object instead of FactoryBean.getObject() ,这个问题被回答为有四个人投了赞成票。所以我认为这个解决方案可能有效,但目前我的代码有问题。

第二个,工作但尴尬:

public class FactoryBeanUser implements ApplicationContextAware{

private MyFactoryBean myFactoryBean;

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

我的问题是可以使第一种方法起作用还是我应该坚持第二种方法?

最佳答案

XML 解析器似乎将 & 符号解释为 XML 实体的开始。您可以尝试使用 ref="&theFactoryBean"

spring docs尚不清楚在 xml 文件中是否允许使用此语法,或者仅在程序查找中允许使用此语法。但是随后应用程序上下文使用了 xml 配置,所以我假设 & 应该可以工作(尽管它似乎不是特殊符号的最佳选择)

这就是我建议另一件事的原因 - 如果你真的需要工厂 bean 而不是它的产品,创建另一个不实现 FactoryBean 的 bean,定义一个方法 createObject() 或类似的东西,并在所有需要它的工厂中使用它。

旁注 - 更好地引用包含版本的 xsd:

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

关于java - 如何注入(inject) FactoryBean 而不是它产生的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3441438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com