spring-aop代理的生效原理
主要说下spring里aop的生效的原理吧,并不是讲底层的cglib和gdk动态代理。
还是老一套的分析流程,先找到了aop的标签的handler,然后看下在解析这个标签的时候,都干了些什么,其实主要就是看下注册了哪些bean,哪些beanPostProcessor. 因为看了那么多的spring的功能实现,基本都是通过这些beanPostProcessor来搞事情的,这个应该也不例外。
Ok,首先一眼会看到,把我们配置的pointCut,advisoe等组装成beanDefinition,向容器注册,这些bean的主要作用只是记录我们配置的那些数据(切入点,目标类,intercepter类等等),并不是什么很重要的部分。然后还看到注册了一个类 :AspectJAwareAdvisorAutoProxyCreator, 这个类是spring中aop生效的核心。
看下继承关系,发现它实现了beanPostProcessor这个接口,ok,和我们一开始的猜测是一样的,然后再看下里边的实现,然后具体里边的实现呢,就不很详细的写了,大体的流程是这样的。
一个Bean开始实例化—> 调用AspectJAwareAdvisorAutoProxyCreator里实例化bean的回调接口,看下能否提前将bean实例化,并创建代理,然后返回最终的代理类 —> 上述失败后,走正常的实例化流程 —> 在bean实例初始化后,调用AspectJAwareAdvisorAutoProxyCreator的beanpostProcessor回调接口 —> 如果还没有拿到所有的advisor实例,先拿到容器里所有的advisor实例,然后for循环去判断当前的这个bean是否应该进行代理,不应该的话,直接返回 —> 根据advisor中的信息,开始对bean进行代理,注意,如果这个bean有多个advisor的话,这里会把适用的advisor都拿出来,作为代理中的interceptor,然后选择采用哪种代理方式,进行底层的代理过程,最后返回被代理后的类。
这里需要注意的是,AspectJAwareAdvisorAutoProxyCreator一定要先于其他普通的bean被实例化,然后,回顾下容器初始化的过程,确实是会先实例化所有的processor,最后才会对普通的bean进行实例。 具体什么样的bean会被实例,什么样的会被延迟实例化,前面的文章中有专门讲过,这里就不多说了。ps:这些beanPostProcessor 内部也是可以设置实例化的优先级的,高优先级的会被先初始化,这个有的时候还是比较重要的,需要留意下。
spring-aop代理的生效原理的更多相关文章
- jdk动态代理与cglib代理、spring aop代理实现原理
原创声明:本博客来源与本人另一博客[http://blog.csdn.net/liaohaojian/article/details/63683317]原创作品,绝非他处摘取 代理(proxy)的定义 ...
- jdk动态代理与cglib代理、spring aop代理实现原理解析
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...
- 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...
- jdk动态代理与cglib代理、spring Aop代理原理-代理使用浅析
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...
- Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)
Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误) 问题: 今天在用AfterReturningAdvice时,a ...
- java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总
若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...
- Spring AOP /代理模式/事务管理/读写分离/多数据源管理
参考文章: http://www.cnblogs.com/MOBIN/p/5597215.html http://www.cnblogs.com/fenglie/articles/4097759.ht ...
- Spring aop 原始的工作原理的理解
理解完aop的名词解释,继续学习spring aop的工作原理. 首先明确aop到底是什么东西?又如何不违单一原则并实现交叉处理呢? 如果对它的认识只停留在面向切面编程,那就脏了.从oop(Objec ...
- Spring AOP的底层实现原理
Spring的两大核心之一就是AOP,AOP:面向切面编程.在说原理之前,得先知道一些 AOP的专业术语. AOP的专业术语 连接点(JoinPoint):增强执行的位置(增加代码的位置),Sprin ...
- Spring Aop之Cglib实现原理详解
Spring Aop实现对目标对象的代理,AOP的两种实现方式:Jdk代理和Cglib代理.这两种代理的区别在于,Jdk代理与目标类都会实现同一个接口,并且在代理类中会调用目标类中被代理的方法,调用者 ...
随机推荐
- windows上安装RabbitMQ
windows下 安装 rabbitMQ 及操作常用命令 rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 ...
- RPG难题
/* 人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Cole终于知道了原因,原来,LELE ...
- BZOJ1935或洛谷2163 [SHOI2007]园丁的烦恼
BZOJ原题链接 洛谷原题链接 很容易想到二维前缀和. 设\(S[i][j]\)表示矩阵\((0, 0)(i, j)\)内树木的棵数,则询问的矩形为\((x, y)(xx, yy)\)时,答案为\(S ...
- ubuntu 下通过ftp命令下载文件
/*连接*/ $ ftp 192.168.180.2Connected to 192.168.180.2.Name (192.168.180.2:rivsidn): admin Password: ...
- from collections import namedtuple 使用
from collections import namedtuple Point = namedtuple('Point', ['x', 'y'])#本质就是等价于 class Point(): # ...
- Python Tutor
Python Tutor Python Tutor 是由 Philip Guo 开发的一个免费教育工具,可帮助学生攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程.通过这个工具, ...
- android-如何获得当前正在运行的activity的相关信息
http://blog.csdn.net/centralperk/article/details/7269326 ActivityManager manager = (ActivityManager) ...
- 20155312张竞予 20170510实践一:在IDEA中以TDD的方式对String类和Arrays类进行学习
实践题目 在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常,错误和边界情况 String类 charAt split Arrays类 sort binarySea ...
- MySQL中使用SHOW PROFILE命令分析性能的用法整理
show profile是由Jeremy Cole捐献给MySQL社区版本的.默认的是关闭的,但是会话级别可以开启这个功能.开启它可以让MySQL收集在执行语句的时候所使用的资源.为了统计报表,把pr ...
- tms web core 里面调用pascal 过程。
procedure show(s:string);begin showmessage(s);end; procedure TForm3.WebButton1Click(Sender: TObject ...