通常你不大会通过Spring中的ApplicationContext直接取bean,你往往通过IOC的方式在你的action或者service等中得到现成的bean,但是在一些特殊情况下你会这样使用。
我今天就遇到这种情况
我需要在测试的时候刷新缓存,那么我直接取出SqlMapClient,虽然也可以搞个注入什么的,但那样太麻烦,
后来我写了如下代码
一切ok
但是后来我发现 org.springframework.orm.ibatis.SqlMapClientFactoryBean
并没有实现SqlMapClient接口,上面那种转型的写法怎么会正确?
通过观察发现 org.springframework.orm.ibatis.SqlMapClientFactoryBean 中含有一个getBean方法返回 SqlMapClient,然后这个方法被org.springframework.beans.factory.support.AbstractBeanFactory的getObjectForSharedInstance方法和StaticListableBeanFactory的getBean方法调用,这两个方法进行调用时都有一个共同的特征就是
再一看 SqlMapClientFactoryBean 果然实现了 FactoryBean 接口
总结如下:
如果一个bean属于 FactoryBean,那么从spring的bean工厂取出来的时候,并不是它本身,而是它的 getObject返回的对象.所以表面上的那种转型不匹配就不足为怪了
我今天就遇到这种情况
我需要在测试的时候刷新缓存,那么我直接取出SqlMapClient,虽然也可以搞个注入什么的,但那样太麻烦,
<
bean
id
="sqlMapClient"
class
="org.springframework.orm.ibatis.SqlMapClientFactoryBean"
>
< property name ="configLocation" >
< value > classpath:/moxtv/central/dao/impl/write/maps/sql-map-config.xml </ value >
</ property >
</ bean >
< property name ="configLocation" >
< value > classpath:/moxtv/central/dao/impl/write/maps/sql-map-config.xml </ value >
</ property >
</ bean >
后来我写了如下代码
.......
SqlMapClient client = (SqlMapClient) SpringBeanProxy
.getBean( " sqlMapClient " );
.......
SqlMapClient client = (SqlMapClient) SpringBeanProxy
.getBean( " sqlMapClient " );
.......
一切ok
但是后来我发现 org.springframework.orm.ibatis.SqlMapClientFactoryBean
并没有实现SqlMapClient接口,上面那种转型的写法怎么会正确?
通过观察发现 org.springframework.orm.ibatis.SqlMapClientFactoryBean 中含有一个getBean方法返回 SqlMapClient,然后这个方法被org.springframework.beans.factory.support.AbstractBeanFactory的getObjectForSharedInstance方法和StaticListableBeanFactory的getBean方法调用,这两个方法进行调用时都有一个共同的特征就是
if
(bean
instanceof
FactoryBean
&&
!
BeanFactoryUtils.isFactoryDereference(name))
{
try {
return ((FactoryBean) bean).getObject();
}
catch (Exception ex) {
throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
}
}
try {
return ((FactoryBean) bean).getObject();
}
catch (Exception ex) {
throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
}
}
再一看 SqlMapClientFactoryBean 果然实现了 FactoryBean 接口
总结如下:
如果一个bean属于 FactoryBean,那么从spring的bean工厂取出来的时候,并不是它本身,而是它的 getObject返回的对象.所以表面上的那种转型不匹配就不足为怪了