代码之家  ›  专栏  ›  技术社区  ›  wax

如何注入FactoryBean而不是它生成的对象?

  •  16
  • wax  · 技术社区  · 15 年前

    假设我有以下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注入其他实例 因子豆 ,而不是它生成的对象。

    有两种可能的解决方法。

    第一个,明显和故障:

     <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");
       }
    }
    

    我的问题是第一种方法是否可行,还是我应该坚持第二种方法?

    1 回复  |  直到 12 年前
        1
  •  15
  •   Bozho    15 年前

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

    这个 spring docs 不清楚XML文件中是否允许使用此语法,还是只允许程序查找。但是XML配置被应用程序上下文使用,所以我假设 &amp; 应该有效(尽管它似乎不是特殊符号的最佳选择)

    这就是为什么我会建议另一件事——如果您真的需要工厂bean而不是它的产品,那么创建另一个不实现的bean。 FactoryBean ,定义方法 createObject() 或者类似的东西,在所有需要它的工厂里使用它。

    附加说明-更好地引用包含版本的XSD:

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