Spring AOP (4)-为业务逻辑组件创建代理对象;

为业务逻辑组件创建代理对象;

一、再次重启项目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;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值