为什么我从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
,即void
。 void
或 Void
导致 null
结果为 return 来自 MethodInvokingFactoryBean
.
如果您想要实际的 FactoryBean
,请将 &
添加到您要检索的 bean 的名称中。请参阅参考指南 section 5.8.3 的最后一部分。
我的 '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
,即void
。 void
或 Void
导致 null
结果为 return 来自 MethodInvokingFactoryBean
.
如果您想要实际的 FactoryBean
,请将 &
添加到您要检索的 bean 的名称中。请参阅参考指南 section 5.8.3 的最后一部分。