在配置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进入到

application.getBean(FactoryBean)源码浅析

application.getBean(FactoryBean)源码浅析

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

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

对ClassPathXmlApplicationContext进行F3进入查看

application.getBean(FactoryBean)源码浅析

其继承了AbstractXmlApplicationContext,继续追踪AbstractXmlApplicationContext

application.getBean(FactoryBean)源码浅析

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

application.getBean(FactoryBean)源码浅析

application.getBean(FactoryBean)源码浅析


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

在AbstractApplicationContext我们终于见到了getBean

application.getBean(FactoryBean)源码浅析

application.getBean(FactoryBean)源码浅析


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

application.getBean(FactoryBean)源码浅析


ConfigurableListableBeanFactory继承了ListableBeanFactory

application.getBean(FactoryBean)源码浅析


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

application.getBean(FactoryBean)源码浅析


终于

application.getBean(FactoryBean)源码浅析

application.getBean(FactoryBean)源码浅析


但是!

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

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

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





相关文章:

  • 2020-10-23
  • 2021-06-01
  • 2018-12-12
  • 2021-12-17
  • 2022-02-01
  • 2021-12-04
  • 2021-05-23
  • 2021-06-07
猜你喜欢
  • 2022-12-23
  • 2022-01-10
  • 2022-01-15
  • 2021-09-07
  • 2022-12-23
  • 2021-06-14
  • 2021-09-13
相关资源
相似解决方案