AOP源码解析
2021-03-01 11:21:41 0 举报
springAOP源码分析
作者其他创作
大纲/内容
类:对ProxyFactory,set操作 如advisors ,targetSource赋值操作
类:AbstractAdvisorAutoProxyCreator
返回InstantiationModelAwarePointcutAdvisorImpl
判断标注了@Aspect的注解的beanisAspect
2
概括方法功能
//可以看笔记的甜品分享搜索“自定义MethodInterceptor”注意自定义的MethodInterceptor接口类行会在这里包装成一个全局拦截的Advice。具体实现方法:1 要给 this.interceptorNames 变量赋值赋值我们的自定义类,发现他有setInterceptorNames的方法这个方法是传入String2 这个方法是那个bean 的方法,目前是:AbstractAutoProxyCreator类中的方法,但这个抽象类是具体子类的AnnotationAwareAspectJAutoProxyCreator 可以调用的方法。3 实现步骤: a 类实现MethodInterceptor 接口,并标注@Compoent 注解 b 从ioc 容器里拿出AnnotationAwareAspectJAutoProxyCreator 的bean实例,调用setInterceptor 入参是,实现MethodInterceptor 接口的类名字
方法:wrapIfNecessary
1
注意:虽然这里匹配有poincut.class 但肯定匹配不到,因为前面是循环没有@pointCut注解的方法的
//自定义MethodInterceptor.拿到AnnotationAwareAspectJAutoProxyCreator对象调用setInterceptorNames方法方法:resolveInterceptorNames
1哪里来的
上一步骤的得到的List<Advisor>入参此方法//判断候选的切面是否作用在当前beanClass上面,就是一个匹配过程。。方法:findAdvisorsThatCanApply
创建advice对象方法:instantiateAdvice
方法:aspectJAnnotation.getAnnotationType()
返回AspectJExpressionPointcut 实例对象
//获取代理实例方法:getProxy
类:BeanFactoryAspectJAdvisorsBuilder
@Import(AspectJAutoProxyRegistrar.class)EnableAspectJAutoProxy
类:InstantiationModelAwarePointcutAdvisorImpl
//创建一个PointCut类,并且把前面从注解里面解析的表达式设置进去构造:new AspectJExpressionPointcut
//把注解里面的信息解析出来,然后包装成AspectJAnnotation对象return new AspectJAnnotation<>(result);
方法:getAdvice
//获取代理实例//注意此方法入参将代理工厂入参进去了方法:createAopProxy
得到工厂里所有的Advisor即切面类
AbstractAspectJAdvisorFactory
得到一个DefaultAdvisorAdapterRegistry实例
类:ProxyCreatorSupport
//获取代理实例方法: getAopProxyFactory
//获取代理实例方法:createAopProxy
类结构
先执行过滤器链,最后执行目标方法,过滤器链中的 invoke方法,后在调用proceed又会重新进入调用过滤器链中,只不过,这里的链会计数此时掉的是链中的下一个
////获取spring容器中的所有bean的名称BeanName,然后过滤出@Aspect标注的类
解释
返回List
类:DefaultAopProxyFactory
问题遗留:
返回AspectAnnotation
//这个target就是被代理实例代码:target = targetSource.getTarget();
//创建切面advisor对象方法:getAdvisors
//获取spring容器中的所有bean的名称BeanName方法:buildAspectJAdvisors
收集起来工程所有的切面类,包装成
方法://如果这个bean有advice的话,创建当前bean的代理getAdvicesAndAdvisorsForBean
//获取到切面advisor中的advice,并且包装成MethodInterceptor类型的对象\t\t\t\t\t\tMethodInterceptor[] interceptors = registry.getInterceptors(advisor);
if (config.isPreFiltered() || pointcutAdvisor.getPointcut().getClassFilter().matches(actualClass))
AnnotationAwareAspectJAutoProxyCreator
类:ProxyFactory
返回代理类实例
类:JdkDynamicAopProxy
//从代理工厂中获得该被代理类的所有切面advisor,config就是代理工厂对象 Advisor[] advisors = config.getAdvisors();
返回targetSource
AspectJAutoProxyRegistrar 注册AnnotationAwareAspectJAutoProxyCreator
被子类实现覆盖
类: DefaultAdvisorChainFactory
返回Advisor[ ]
类:AbstractAutoProxyCreator
解释工厂在哪里被赋值
方法:findCandidateAdvisors
返回代理实例
DefaultAdvisorAdapterRegistry
1调用属性
方法:ajexp.setExpression(aspectJAnnotation.getPointcutExpression());
返回代理类JdkDynamicAopProxy,CglibAopProxy
还有一些参数绑定,其中Joinpoint参数必须是第一个
返回list
类:ReflectiveAspectJAdvisorFactory
AdvisorAdapterRegistry registry = GlobalAdvisorAdapterRegistry.getInstance();
//注解的方法,并且把注解里面的信息封装成AspectJAnnotation对象方法:findAspectJAnnotationOnMethod
类:BeanFactoryAdvisorRetrievalHelper
4
父类
方法的解释
//获取pointCut对象,最重要的是从注解中获取表达式方法:getPointcut
//获取代理工厂的targetSource//注意这其中advised 就是代理实例化时的工厂属性:this.advised.targetSource
方法:findAdvisorBeans
//找到合格的切面Advisor方法:findEligibleAdvisors
类:AnnotationAwareAspectJAutoProxyCreator
//如果切面的pointCut和被代理对象是匹配的,说明是切面要拦截的对象,主要是match方法做匹配,记得自定义的methodInterceptor 的match 方法永远返回true
返回Object[ ]数组,数组内元素是:Advisor
解释工厂持有Advisor[ ]
类:DefaultAdvisorAdapterRegistry
3
//获取代理实例方法:invoke
这个类的赋值,是在ProxyFactory 无惨构造触发了父类的无参构造
主要是对MethodBeforeAdvice,AfterReturningAdvice这两种advice 不是事先了MethodInterceptor接口的,需要在这里包装,包装用的是那种适配器模式,包装后的好处就是链式调用省去了if else 的判断,都是统一的 调用 proceed的方法,分别包装成了AfterReturningAdviceInterceptor,MethodBeforeAdviceInterceptor,他们是实现了MethodInterceptor接口的
类:AspectJExpressionPointcut
////创建代理工厂,每个代理对应唯一个new ProxyFactory();
返回List
类:AbstractAspectJAdvisorFactory
类:TargetSource
//对自定义的advice要进行包装,把advice包装成advisor对象,切面对象,注意这里对之前收集注解产生的Advisor是不会起作用的!,因为如果是Advisor 类型直接返回,这里就是对自定义的advice进行包装!方法:wrap
//根据不同的注解类型创建不同的advice类实例 switch (aspectJAnnotation.getAnnotationType()) { case AtPointcut: if (logger.isDebugEnabled()) { logger.debug(\"Processing pointcut '\" + candidateAdviceMethod.getName() + \"'\
当代理类被调用直接看invoke 方法
//创建Advisor切面类,这才是真正的切面类,一个切面类里面肯定要有1、pointCut 2、advice构造方法:new InstantiationModelAwarePointcutAdvisorImpl
构造中创建了Advice
方法:getAdvisor
返回DefaultAopProxyFactory
//从代理工厂中拿过滤器链 Object是一个MethodInterceptor类型的对象,其实就是一个advice对象方法: getInterceptorsAndDynamicInterceptionAdvice
1 //获取有@Aspect注解的类2 //找到candidateAdviceMethod方法上面的注解,并且包装成AspectJAnnotation对象,这个对象中就有注解类型3根据获取到道注解封装成的AspecjAnnotation 的类型 新建不同的Advice
返回Advice
//在if判断后如果有Advisor,开始创建代理调用:createProxy
0 条评论
下一页