羽化登峰

导航

 

上一章节提到了代理,那么spring如何实现代理的
先将对象初始化进行扫尾工作,调用initializeBean()

  1)继承BeanNameAware、BeanClassLoaderAware、beanFactoryAware的子类,进行对应属性注入
  2)处理继承InitializingBean的子类afterPropertiesSet()方法或xml中配置的init-method方法
  3)处理所有BeanPostProcess的子类postProcessAfterInitialization()

spring开启代理是需要注解或者xml的,因为需要引入两个类中的一个:AspectJAwareAdvisorAutoProxyCreator或AnnotationAwareAspectJAutoProxyCreator,继承关系,可以看出是在第三步的时候完成,

以AspectJAwareAdvisorAutoProxyCreator类为例:实现了postProcessAfterInitialization()

首先判断当前对象是否满足代理要求,如果不满足结束
如果满足,则调用 getAdvicesAndAdvisorsForBean()方法,获取当前对象匹配中的advisor对象

如果没有创建,则需要遍历BeanDefinition找到所有Advisor接口的bean,并调用getBean()方法创建。

在Advisor对象中有一个属性Advice对象,Advice在AOP中AbstractAspectJAdvice会有两个属性:pointcut(匹配规则),aspectJAdviceMethod(要执行的方法)
调用findAdvisorsThatCanApply()遍历Advisor取出pointcut(匹配规则)与当前对象完全限定名+method方法名匹配,如果匹配中则加入代理

对最后选择的Advisor进行扩展和排序,在createProxy方法中buildAdvisors()对advisor进行转换

生成的字节码文件,并返回代理对象,代理对象有一个重要属性CGLIB$CALLBACK_0,这个属性包含了当前对象所有信息

当调用对象方法时,首先调用DynamicAdvisedInterceptor.intercept()

调用proceed()使用责任链模式完成所有的MethodInterceptor.invoke()和method.invoke()方法完成这个方法的执行过程

 

posted on 2022-03-10 14:13  默默攀岩  阅读(309)  评论(0)    收藏  举报