application.getBean(FactoryBean)源码浅析

在配置ehcache的时候没搞懂以下配置到底什么情况,其中EhCacheManagerFactoryBean到底返回的到底是EhCacheManagerFactoryBean实例还是CacheManager实例,返回CacheManager实例的话又是org.springframework.cache.ehcache.EhCacheCacheManager还是net.sf.ehcache.CacheManager

经过一番折腾才知道EhCacheManagerFactoryBean实现了FactoryBean接口,通过加载设置的configLocation属性,返回的其实是net.sf.ehcache.CacheManager(最终是调用FactotyBean的getObject() 方法。重点)。

网上看到一个很形象的比喻,FactoryBean就像一个女人,她也是人,只不过她能产生人,这比喻有点尬但感觉蛮贴切。

于是spring的EhCacheCacheManager就通过引用EhCacheManagerFactoryBean产生的net.sf.ehcache.CacheManager作为其属性,创建一个spring的EhCacheCacheManager实例,我们可以通过这个实例的getCacheManager()方法得到其引用的net.sf.ehcache.CacheManager实例。


  <bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
    <property name="cacheManager" ref="ehcacheManager"/>
  </bean>

  <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:properties/ehcache.xml"/>
  </bean>


现在来追踪对EhCacheManagerFactoryBean调用application.getBean()的源码

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-x.xml");

Object obj = applicationContext.getBean("ehcacheManager");

System.out.println(obj.getClass());

控制台输出

class net.sf.ehcache.CacheManager

可见我们以上的分析没错


对applicationContext.getBean("ehcacheManager");按F3进入到



可知Bean的实例化最终是在某个实现了BeanFactory接口的类中的getBean方法实现的

由于我们测试用的是ClassPathXmlApplicationContext,对其进行追踪,看哪个地方由实现了BeanFactory接口并且实现了它的getBean()方法。

对ClassPathXmlApplicationContext进行F3进入查看


其继承了AbstractXmlApplicationContext,继续追踪AbstractXmlApplicationContext


在这货里面还没有getBean(),继续追踪




终于等到你,还好我没有放弃

在AbstractApplicationContext我们终于见到了getBean




return getBeanFactory().getBean方法即是最终对Bean的初始化,我们继续追踪getBeanFactory,可以看到调用的是ConfigurableListableBeanFactory的getBean()



ConfigurableListableBeanFactory继承了ListableBeanFactory



ListableBeanFactory又继承了BeanFactory,是不是很熟悉,我们之前说最终就是返回BeanFactory的getObject()


终于



但是!

大佬们都是说最终调用的是AbstractBeanFactory中的getBean,然后调用doGetBean,最终调FactoryBean的getObject。我怎么也找不到从哪调用的= =,求大佬解释下感激不尽!!这是两个大佬写的文章。

https://blog.csdn.net/java2000_wl/article/details/7410714

https://blog.csdn.net/yzx2015fd/article/details/50512354





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值