SpringAop生成动态代理源码解析
2021-12-10 08:53:42 0 举报
SpringAop生成动态代理源码解析
作者其他创作
大纲/内容
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
中途省略过几个方法,将AnnotationAwareAspectJAutoProxyCreator注册到spring容器中,如果已存在的存在的自动代理器与现在的不一致,按照优先级判断使用哪个,最后封装成beanDefinition注册到容器中
查找出满足当前匹配当前bean通配符的增强器
查找需要被实例化bean的增强器
1.当使用xml方式声明aop的时候使用左面的类,它是BeanDefinitionParser接口的实现类,所有的解析器都实现了BeanDefinitionParser接口,在解析xml文件\"aspectj-autoproxy\"标签时首先会调用会调用AopNamespaceHandler.init()方法注册该解析器2.当使用注解的方式需要声明@EnableAspectJAutoProxy注解,当注解被扫描时会加载AspectJAutoProxyRegistrar.class进行BeanDefinition的注册
instantiateAdvice(this.declaredPointcut);
查找spring工厂中的所有增强器(此方法描述获取增强器的几大步骤)1.获取beanName,beanFactory中注册到bean都会提取出来2.遍历所有beanName,找出声明AspectJ注解的类3.对标记为AspectJ的类进行增强器的提取,将提取出来的Aspect类包装为BeanFactoryAspectInstanceFactory进行切面增强器的提取4.将提取出来的增强器存入缓存
下面重点讲一下,创建SpringAOP代理类之前获取切面增强器,过程比较复杂,耐心看,看懂了这个才真正能搞明白代理是怎么创建的
对增强器进行初始化操作查找切面方法上面的注解,根据不同的注解生成不同的增强器,如:AtBefore、AtAfter、AtAfterReturning、AtAfterThrowing、AtAround
SpringAop生成动态代理源码解析
查找需要被实例化的增强器,存在的从缓存获取,不存在的话进行下面的方法查找
生成增强器,增强器实现类:InstantiationModelAwarePointcutAdvisorImpl所有的增强器都实现于Advisor接口进行属性的赋值操作
Spring容器创建AOP之前查找增强器的过程
增强器的获取1.getAdvisorMethods(aspectClass)方法,排除注解为@Pointcut的类,对PointCut方法不处理,并队其他切面方法进行排序2.获得PointCut切点表达式、切面方法
执行后置处理器
看到这里给你一个赞,你的耐心和坚持已经超越了80%的人,持之以恒加油!下面重点讲一下,创建SpringAOP代理类的过程,这次是真的讲spring如何创建代理类的了,不忽悠
AnnotationAwareAspectJAutoProxyCreator.buildAspectJAdvisors()
xml方式和注解方式的注册方法
SpringAOP注册创建代理类AnnotationAwareAspectJAutoProxyCreator的过程
重点类:AnnotationAwareAspectJAutoProxyCreator该类实现了一个非常重要的类:BeanPostProcessor,在实例化bean时会调用动态代理创建类的父亲级方法实现的的后置处理器方法进行创建AOP代理
经过上面的很多过程,spring终于拿到该类的增强器了,通过增强器就可以实现aop的创建了1.spring委托给ProxyFactory去处理2.在创建的过程中,会判断该类使用jdk还是cglib动态代理jdk动态代理:当该类存在接口时使用jdk创建代理cglib动态代理:当类没有接口的情况下,采用继承的方式创建动态代理在目标实现了接口的情况下也可以强制使用cglib实现AOP
通过手动注册的方式注册、升级或配置Aspectj自动代理创建者AnnotationAwareAspectJAutoProxyCreator.class
在bean初始化的过程中会调用BeanPostProcessor接口的前置和后置处理器
AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors()
查找spring工厂中的所有增强器xml文件配置的和注解配置的切面
getAdvicesAndAdvisorsForBean(查找增强器的内部过程)
List<Advisor> classAdvisors = this.advisorFactory.getAdvisors(factory)
AspectJAutoProxyRegistrar.registerBeanDefinitions
Spring创建代理类
查找出符合的增强器,创建代理
0 条评论
回复 删除
下一页