为业务逻辑组件创建代理对象;
一、再次重启项目debug到refresh()的这个方法:finishBeanFactoryInitialization(beanFactory);
方法名直译:完成BeanFactory的初始化;即工作内容是:初始化剩下的单实例bean(如业务逻辑组件MathCaculator等)
该方法是继上面的方法registerBeanPostProcessors(beanFactory);(注册后置处理器完成bean创建的拦截)之后的一个新方法;
1)遍历容器中所有的BeanNames,一次调用getBean()创建对象;
解析getBean()的执行过程:getBean()-->doGetBean()-->sharedInstance = getSingleton()
{说明:在doGetBean()方法前部分已经调过一次getSingleton();说明创建Bean时,是会先从缓存中获取当前bean,如果获取到说明Bean是之前被创建过的,直接使用;否则,再创建;Spring就是这样保证单实例bean只会被创建一次的;且只要被创建好的bean都会被缓存起来;}
-->singletonObject = singletonFactory.getObject();-->createBean(beanName, mbd, args)
在createBean()方法中有这样一段代码:
a)resolveBeforeInstantiation():希望后置处理器在此能返回一个代理对象,如果能返回代理对象就使用;如果不能就继续调用下面的doCreateBean();
-->Object beanInstance = doCreateBean(beanName, mbdToUse, args){该方法是真正的创建一个bean实例}-->exposedObject = initializeBean(beanName, exposedObject, mbd);-->
创建业务逻辑组件,完成后,调用postProcessAfterInitialization()返回代理对象;
wrapIfNecessary(bean, beanName, cacheKey){
Object[] specificInterceptors =getAdvicesAndAdvisorsForBean(){
findEligibleAdvisors(beanClass, beanName)
{
findCandidateAdvisors(){};//获取当前bean的所有候选增强器;
findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName){};//找到能在当前bean使用的增强器(找哪些通知方法是需要切入当前bean的);
extendAdvisors(eligibleAdvisors){};
sortAdvisors(eligibleAdvisors){}//排序
}
}this.advisedBeans.put(cacheKey, Boolean.TRUE);//保存当前bean在advisedBeans;
}