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代理与目标类都会实现同一个接口,并且在代理类中会调用目标类中被代理的方法,调用者 ...
随机推荐
- Linux移植之子目录下的built-in.o生成过程分析
在Linux移植之make uImage编译过程分析中罗列出了最后链接生成vmlinux的过程.可以看到在每个子目录下都有一个built-in.o文件.对于此产生了疑问built-in.o文件是根据什 ...
- 初次搭建spring-boot 整合ssm(有许多小坑)
首先,我是采用官网下载,版本最好选择1.5.16的(这是重点) 下载完毕后,用idea打开解压后的项目. 1.整合spring-mvc 在pom.xml中加入web依赖 <dependency& ...
- Oracle_SQL(4) DDL 表和约束
数据库对象分为占存储空间的对象和不占存储存储空间的对象.占存储空间的对象主要包括:表.索引等.select distinct segment_type from dba_segments order ...
- HDOJ4734 F(x)
原题链接 数位\(DP\),继续套记搜模板 定义\(f[pos][now]\),\(pos\)是枚举到的位数,\(now\)是\(A\)的权值减去当前枚举的数的权值,即剩余权值大小. 然后就是记搜模板 ...
- VisualStudio使用技巧
控制台工程去除黑框 刚学习OpenGL,绘制图形的时候,如果不进行设置,运行的时候会先出现黑窗口再出现Windows窗口.其实要去除控制台窗口非常简单,只需要修改工程设置,把子系统改成Windows, ...
- $(QTDIR);$(QTDIR)\include\QtCore;$(QTDIR)\include;
$(QTDIR); 在系统环境变量中定义即可 vs属性中设置头文件路径
- [SoapUI] Groovy获取HTTP Status
def value = messageExchange.responseHeaders["#status#"] def httpResponseHeaders = context. ...
- [Robot Framework] 搭建Robot Framework和RIDE(Robot Framework GUI) 的环境
在windows x64的环境上进行安装,集成Selenium2和AutoIt的libraries,以下安装步骤在win 7,win 8.1,win 10, win 2012 R2上测试通过 1. 下 ...
- ssh密钥讲解
我们用ssh连接机器时候需要输用户名.密码,但是直接写账户文件的时候由于用的是明文,就存在安全的问题了.别人一旦截取了数据就获得了隐私了.这时候就用上ssh的密钥. ssh的密钥存是成对出现的,一个叫 ...
- 利用PHP脚本辅助MySQL数据库管理2-表主键表索引
<?php $dbi = new DbMysql; $dbi->dbh = 'mysql://root:mysql@127.0.0.1/coffeetest'; $map = array( ...