我们将从缓存中获取对象的情况分成一下三种情况:
1、根据beanName在singletonObjects中能直接取到对象bean,且当前bean不是FactoryBean类,或者当前bean是FactoryBean类,但name中带有‘&’前缀:
说明这个获取得到的bean就是调用者想要获取的bean。这时只需要直接返回这个bean就可以了。
2、根据beanName在singletonObjects中能直接取到对象bean,但当前bean是FactoryBean类,且name中不带有‘&’前缀:
说明这个获取到的bean是工厂bean,调用者真正想要的是通过工厂生产出来的bean。

这时候spring并不会直接调用FactoryBean的getObject()获取bean,而是先从工厂生产的缓存factoryBeanObjectCache中查找。
若找到了,则直接返回该bean。
如果没有找到,则先合并当前的beanDefinition和其父beanDefinition得到mbd。从而取到mbd的synthetic属性。这个属性标识这个bean是否是人工生成的
然后调用getObjectFromFactoryBean()方法
如果这个factoryBean生成的不是单例的bean,则直接调用doGetObjectFromFactoryBean()方法
这里的System.getSecurityManager是获取系统的安全管理权限,在安全的情况下,调用了factoryBean的getObject()方法得到了bean。
如果这个factoryBean是单例工厂,则在通过doGetObjectFromFactoryBean()获取bean之后,将bean放置在了factoryBeanObjectCache缓存中。
这里的postProcessObjectFromFactoryBean方法是一个通过工厂生产bean的一个后处理器,关于后处理器在后续章节会详细了解,这里只需要知道在spring获取bean的规则中有一条:尽可能保证所有bean初始化后都会调用注册的BeanPostProcessor的postProcessAfterInitialization方法进行处理,在实际开发中,大可以针对此特性设计自己的业务逻辑。
3、根据beanName在singletonObjects中不能取到对象bean,但在singletonsCurrentlyInCreation中有此beanName:
说明这个bean正在被创建中,那么spring就会:
1)先尝试在earlySingletonObjects中查找bean的缓存,若找到了则直接返回。
2)如果还是没找到,就会在singletonFactories中查找这个beanName对应的ObjectFactory缓存,如果这时候还没找到,则需要走完创建bean的流程了,return 空。singleton bean
3)如果找到了对应的ObjectFactory,则通过ObjectFactory的getObject()方法获取bean。并在将其放在earlySingletonObjects的缓存中。并在singletonFactories中移除次ObjectFactory。
这样通过缓存获取bean的过程就结束了。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-58005-2.html
王健林说得还是比较现实
同时公积金不变
他进入12海里以內了