当我从春天得到一个豆子时,为什么我会得到null?

时间:2015-01-16 03:11:07

标签: spring spring-bean

我的' applicationContext.xml'春天的文件是:

<bean id="gzipResponseInterceptor" class="my.interceptor.GzipResponseInterceptor"/>

<bean id="addResponseInterceptor" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject">
        <ref local="httpClient"/>
    </property>
    <property name="targetMethod">
        <value>addResponseInterceptor</value>
    </property>
    <property name="arguments">
        <list>
            <ref bean="gzipResponseInterceptor"/>
        </list>
    </property>
</bean>

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <constructor-arg>
        <bean class="org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager" p:defaultMaxPerRoute="100"
              p:maxTotal="100"/>
    </constructor-arg>
</bean>

然后在我的Java代码中:

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(context.getBean("gzipResponseInterceptor"));
System.out.println(context.getBean("addResponseInterceptor"));
System.out.println(context.getBean("httpClient"));

它打印出来:

my.interceptor.GzipResponseInterceptor@525f1e4e
null
org.apache.http.impl.client.DefaultHttpClient@75f9eccc

注意bean&#39; addResponseInterceptor&#39;的值。是null!我无法理解为什么我可以获得null的春豆。

1 个答案:

答案 0 :(得分:2)

addResponseInterceptorMethodInvokingFactoryBean,顾名思义,其唯一目的是调用方法。在执行context.getBean("addResponseInterceptor")时,返回的内容是getObject的{​​{1}}方法的结果。

MethodInvokingFactoryBean返回被调用方法的结果。

根据被调用方法的名称FactoryBean判断,即addResponseInterceptorvoidvoid会导致Void结果从null返回。

如果您希望实际MethodInvokingFactoryBeanFactoryBean添加到要检索的bean的名称。请参阅参考指南的section 5.8.3的最后一部分。