失效链接处理 |
springAOP核心组件分析 PDF 下载
本站整理下载:
相关截图:
主要内容:
进入AbstractApplicationContext类
841行 finishBeanFactoryInitialization()
857行:String[] weaverAwareNames//与AspectJ weaver相关的,
可以不关注
在869行,开始操作,初始化剩下的单实例bean,完成剩余bean的创
建,beanFactory.preInstantiateSingletons(),点进此方法
进入DefaultListableBeanFactory类,
734行:获取容器中所有的bean名,并遍历获取容器中所有的bean名,依
次进行初始化和创建对象(第一个bean跟我们关系不大),但我们可以看
看创建流程
738行:拿到bean的定义信息
739行:bean不是抽象, 是单实例, 不是懒加载
如果满足这3条件,可以实例化bean
740行:工厂模式,是否实现FactoryBean接口的bean,如果是的话就会
调用FactoryBean的getObject来获取bean
755行 getBean(..),此方法为生成单实例bean的主要方法, 跟进此方
法,见右箭头
766行:所有bean都创建完后,触发初始化后置处理器的回调方法,其实
就是把所有的bean对象遍历,检查所有的Bean是否是
SmartInitializingSingleton接口的,如果是就执行
afterSingletonsInstantiated();
进入AbstractBeanFactory类,
198行:public Object getBean(String name){
return doGetBean(...); }//此处的getBean与测试用例anno.getBean()是同一个
继续跟进此方法,进入下面239行
239行进入此方法
246行:Object sharedInstance = getSingleton(beanName);第一
次获取先检查单实例的缓存中是不是存在此bean;
247行:if(sharedInstall != null)//缓存中有,就直接拿
269行:spring是否存在父子容器,直接跳过,没有父子工厂关系
287:markBeanAsCreated(beanName)//标记当前bean已被创建了,防
止在多线程情况下,两个线程同时来创建一个bean,那就不是单实例了
291行:RootBeanDfinition mbd //获取bean定义信息
295行:String[] dependsOn//获取当前bean依赖的其它bean,如果有
依赖的bean,就先把依赖的bean先创建出来,见304行
314行:if (mbd.isSingleton())//如果bean是单实例的
315行:lambda,传一个beanName进行创建bean
317行:若不能获取才到创建,return createBean(beanName;
spring就是利用这个机制,保证单实例bean的唯一, 点击跟进
createBean方法
|