在配置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实例。
<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