为什么我从spring中获取一个bean,却能获取到null?

Why can I get null when I get a bean from spring?

我的 'applicationContext.xml' 文件 spring 是:

<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 'addResponseInterceptor' 的值是 null!我不明白为什么我可以用 spring 个 bean 得到 null

addResponseInterceptor 是一个 MethodInvokingFactoryBean,顾名思义,其唯一目的是调用方法。在执行 context.getBean("addResponseInterceptor") 时,returned 是 FactoryBean.

getObject 方法的结果

MethodInvokingFactoryBean return 是调用方法的结果。

从被调用的方法名来看,addResponseInterceptor,即voidvoidVoid 导致 null 结果为 return 来自 MethodInvokingFactoryBean.

如果您想要实际的 FactoryBean,请将 & 添加到您要检索的 bean 的名称中。请参阅参考指南 section 5.8.3 的最后一部分。