本工程Spring5.1源码带翻译地址已经放到本人gitee,看文章反响,如果需要的人多再上连接吧;
Spring IOC 容器主要主要两个作用:1、产生bean,2、获取bean;想知道怎么产生bean,也就是bean的生命周期,先从如何获取bead入手阅读源码,u8带你了解核心思想;
一、Spring如何获取一个简单bean(源码阅读)
图中两个断点,具体看注释,获取spring容器中userService的bean再第二个断点,u8带你debug走下面流程;
第一步:getBean
第二步:AbstractApplicationContext.getBean
第三步:AbstractBeanFactory 中 getBean方法中doGetBean
第四步:doGetBean方法
我们的目的:获取bean 即userService对象,那我们就应该关注本方法中,什么时候返回object,
跟着断点走,会发现 Object sharedInstance = getSingleton(beanName); 这行会返回对象,那我 们就去看getSingleton方法中从哪里获取的对象;
第五步:getSingleton方法解读
getSingleton中第二个boolean类型参数我们可以不用管,是循环依赖开关,我们目前只有一个userService,不需要考虑循环依赖
可以看到该方法中,Object singletonObject = this.singletonObjects.get(beanName); 获取到了Spring中具有完整生命周期的userSevice;
接下来u8带你看singletonObjects是个什么东东
是个map,这说明什么,我们从Spring容器中获取到的bean是存在map中,也就是俗称的单例池中。至此,bean的获取流程就完成;有存就有放,那我们找下singletonObjects的put方法在哪里,也就是Spring什么时候放的。
第六步:查找singletonObjects.put()方法
1、
2、名称不对,有带early,肯定不是
3、jndiObject,看名字显然不是
所以,调用的是在第一个方法中调用的put方法,u8接下来把断点打到这个方法上我们来验证下;
果然,Spring单例产生的bean是通过这个方法放到单例池中的,那我们通过这个方法中的断点倒推spring bean的完整生命周期代码流程;分9步走完;
下一期u8带你阅读spring bean如何走完这9步的源码分析;



