ProxyFactoryBean返回Target类的null类对象

时间:2010-10-02 10:49:45

标签: java spring

我在ProxyFactoryBean班级面临问题,

我们希望获得targetBean的{​​{1}}的班级名称。

当我们在ProxyFactoryBean上调用getType给出bean名称时,它总是返回null。

我们的Java代码是

BeanFactory

我们的配置文件如下:

public class TestSpring {
   public static void main(String args[]){    
     TestSpring ts = new TestSpring();
     ts.process();
   }

   private void process() {
     BeanFactory factory = new XmlBeanFactory(new FileSystemResource("E:\\beans.xml"));
     Class c = factory.getType("scor.imagedev.action.imageDevServerTaskActions");
     System.out.println(c);
   }
}

我想在此处添加的其他一些内容。

  1. 如果我们将bean设为单身,它就可以了。但在我们的案例中,我们希望它成为原型。
  2. 我们必须使用<bean id="scor.actionProxyTemplate" class="org.springframework.aop.framework.ProxyFactoryBean" abstract="true" > <property name="proxyTargetClass" value="true" /> </bean> <bean id="scor.imagedev.action.imageDevServerTaskActions" parent="scor.actionProxyTemplate" scope="prototype"> <property name="target"> <bean class="test.spring.Foo"/> </property> </bean> 。这是我们的基础框架拨打电话。我们无法改变我们的基础框架。
  3. BeanFactory.getType(<beanName>)会解决问题吗?我试了但是没用。可能是我错误地使用了它
  4. 我使用的是Spring 2.0.6。
  5. 此致 ANKIT

2 个答案:

答案 0 :(得分:0)

文档说如果类型不可确定,该方法将返回null。我找不到这意味着什么的参考,但鉴于症状,我认为由于原型范围,它是不可确定的。 (bean存在,因为否则会抛出异常)

查看源代码后,我没有看到返回null的原因 - 如果没有单例,则查询bean定义。我可以建议尝试暂时获得弹簧2.5.6(或3.0.x)并查看问题是否可以复制或修复。

答案 1 :(得分:0)

我遇到了同样的问题,在调试时发现,AbstractBeanFactory中的getTypeForFactoryBean函数运行不正常。此函数为protoType bean返回NULL。

/**
     * Determine the bean type for the given FactoryBean definition, as far as possible.
     * Only called if there is no singleton instance registered for the target bean already.
     * <p>The default implementation creates the FactoryBean via <code>getBean</code>
     * to call its <code>getObjectType</code> method. Subclasses are encouraged to optimize
/
protected Class getTypeForFactoryBean(String beanName, RootBeanDefinition mbd) {
            if (!mbd.isSingleton()) {
                return null;
            }
            try {
                FactoryBean factoryBean = (FactoryBean) getBean(FACTORY_BEAN_PREFIX + beanName);
                return getTypeForFactoryBean(factoryBean);
            }
            catch (BeanCreationException ex) {
                // Can only happen when getting a FactoryBean.
                logger.debug("Ignoring bean creation exception on FactoryBean type check", ex);
                return null;
            }
        }

理想情况下,上面的函数应该在ProxyFactoryInstance上调用getObjectType,但是由于首先检查上面的单例函数返回NULL。