b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

singleton bean Spring 源码学习(4)(2)

电脑杂谈  发布时间:2018-01-04 03:03:36  来源:网络整理

我们将从缓存中获取对象的情况分成一下三种情况:

1、根据beanName在singletonObjects中能直接取到对象bean,且当前bean不是FactoryBean类,或者当前bean是FactoryBean类,但name中带有‘&’前缀:

说明这个获取得到的bean就是调用者想要获取的bean。这时只需要直接返回这个bean就可以了。

2、根据beanName在singletonObjects中能直接取到对象bean,但当前bean是FactoryBean类,且name中不带有‘&’前缀:

说明这个获取到的bean是工厂bean,调用者真正想要的是通过工厂生产出来的bean。

python singleton_singleton bean_c singleton

这时候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海里以內了

    • 韩愈
      韩愈

      王健林说得还是比较现实

    • 范梦龙
      范梦龙

      同时公积金不变

    热点图片
    拼命载入中...