Spring中的getBean

本文探讨了在Spring框架中如何正确地使用FactoryBean及其返回的对象。通过实例解释了为何直接获取的FactoryBean实例不是其自身,而是通过getObject方法返回的目标对象。
通常你不大会通过Spring中的ApplicationContext直接取bean,你往往通过IOC的方式在你的action或者service等中得到现成的bean,但是在一些特殊情况下你会这样使用。

我今天就遇到这种情况
我需要在测试的时候刷新缓存,那么我直接取出SqlMapClient,虽然也可以搞个注入什么的,但那样太麻烦,

<beanid="sqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<propertyname="configLocation">
<value>classpath:/moxtv/central/dao/impl/write/maps/sql-map-config.xml</value>
</property>
</bean>


后来我写了如下代码
.......
SqlMapClientclient
=(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(beaninstanceofFactoryBean&&!BeanFactoryUtils.isFactoryDereference(name))...{
try...{
return((FactoryBean)bean).getObject();
}

catch(Exceptionex)...{
thrownewBeanCreationException(beanName,"FactoryBeanthrewexceptiononobjectcreation",ex);
}

}

再一看SqlMapClientFactoryBean 果然实现了FactoryBean 接口

总结如下:
如果一个bean属于 FactoryBean,那么从spring的bean工厂取出来的时候,并不是它本身,而是它的
getObject返回的对象.所以表面上的那种转型不匹配就不足为怪了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值