Spring AOP 实现原理
什么是AOP
AOP使用场景
实现AOP的技术
如何使用Spring AOP
Spring AOP代理对象的生成
InvocationHandler是JDK动态代理的核心
public Object invoke(Object proxy,Method method,Object[] args) throwsThrowable {MethodInvocation invocation =null;Object oldProxy =null;boolean setProxyContext =false;TargetSource targetSource =this.advised.targetSource;Class targetClass =null;Object target =null;try{//eqauls()方法,具目标对象未实现此方法if(!this.equalsDefined &&AopUtils.isEqualsMethod(method)){return(equals(args[0])?Boolean.TRUE :Boolean.FALSE);}//hashCode()方法,具目标对象未实现此方法if(!this.hashCodeDefined &&AopUtils.isHashCodeMethod(method)){return newInteger(hashCode());}//Advised接口或者其父接口中定义的方法,直接反射调用,不应用通知if(!this.advised.opaque &&method.getDeclaringClass().isInterface()&&method.getDeclaringClass().isAssignableFrom(Advised.class)){// Service invocations onProxyConfig with the proxy config...returnAopUtils.invokeJoinpointUsingReflection(this.advised,method, args);}Object retVal =null;if(this.advised.exposeProxy){// Make invocation available ifnecessary.oldProxy =AopContext.setCurrentProxy(proxy);setProxyContext =true;}//获得目标对象的类target = targetSource.getTarget();if(target !=null){targetClass = target.getClass();}//获取可以应用到此方法上的Interceptor列表List chain =this.advised.getInterceptorsAndDynamicInterceptionAdvice(method,targetClass);//如果没有可以应用到此方法的通知(Interceptor),此直接反射调用 method.invoke(target, args)if(chain.isEmpty()){retVal =AopUtils.invokeJoinpointUsingReflection(target,method, args);}else{//创建MethodInvocationinvocation = newReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);retVal = invocation.proceed();}// Massage return value if necessary.if(retVal !=null&& retVal == target &&method.getReturnType().isInstance(proxy)&&!RawTargetAccess.class.isAssignableFrom(method.getDeclaringClass())){// Special case: it returned"this" and the return type of the method// is type-compatible. Notethat we can't help if the target sets// a reference to itself inanother returned object.retVal = proxy;}return retVal;}finally{if(target !=null&&!targetSource.isStatic()){// Must have come fromTargetSource.targetSource.releaseTarget(target);}if(setProxyContext){// Restore old proxy.AopContext.setCurrentProxy(oldProxy);}}}
参考文章
Spring AOP 实现原理的更多相关文章
- 【Spring】Spring AOP实现原理
		
Spring AOP实现原理 在之前的一文中介绍过Spring AOP的功能使用,但是没有深究AOP的实现原理,今天正好看到几篇好文,于是就自己整理了一下AOP实现的几种方式,同时把代理模式相关知识也 ...
 - 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析
		
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...
 - Spring Aop底层原理详解
		
Spring Aop底层原理详解(来源于csdn:https://blog.csdn.net/baomw)
 - spring AOP底层原理实现——jdk动态代理
		
spring AOP底层原理实现——jdk动态代理
 - Spring AOP底层原理
		
------------------siwuxie095 Spring AOP 底层原理 AOP 即 Aspect Or ...
 - jdk动态代理与cglib代理、spring Aop代理原理-代理使用浅析
		
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...
 - Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现
		
前文,我们分析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的.本文主要介绍Spring AOP原理解析的切面实现过程(将切面类的所 ...
 - Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建
		
上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...
 - Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现
		
我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理.@pdai Spring框架系列 ...
 
随机推荐
- 虚拟机下Linux系统安装vmtool工具
			
1.启动此虚拟机2.用超级用户root登录3.登录成功后,Ctrl+Alt ,取出鼠标,点选菜单栏,虚拟机 →安装VMware工具 → Install4.待虚拟系统挂载了光盘后,弹出cdrom文件夹或 ...
 - 使用 Linux 终端 SSH 登录 VPS
			
Windows 中远程 SSH 登录 VPS 进行管理的利器是 PuTTY,但是 Linux 中就没必要用它了.Linux.Unix(包括 Mac iOS)都必然有内置的命令行终端,内建了 OpenS ...
 - 【转】Android Interface的使用
			
原文网址:http://www.3g-edu.org/Android_free/art115.htm Android应用程序采用Java语言编写,Java语法和C/C++有很大的相似性,但也有一些特别 ...
 - RAC实例 表空间 维护
			
先配置一下监听,这样我们就可以从客户端进行连接了. 我这里写了三种连接. 第一种是正常方式,一般都采用这种方式,后面的rac1和rac2 是方便测试.因为如果用第一种方式的话,客户端连哪个实例是随机的 ...
 - Oracle查看和修改其最大的游标数
			
原文 Oracle查看和修改其最大的游标数 以下的文章主要是介绍Oracle查看和修改其最大的游标数,本文主要是通过相关代码的方式来引出Oracle查看和修改其最大的游标数的实际操作步骤,以下就是文章 ...
 - 【Mongo】MongoVUE的使用
			
我一直是在终端操作的mongo,各种update set remove insert,后来查了下有个叫mongoVUE的客户端,界面化比较方便操作吧~ 网上搜了下,说MongoVUE已经n年没有更新了 ...
 - 如何配置Drupal数据库信息?
			
Drupal的数据库连接信息通过文件settings.php中的变量$databases设置.变量$databases是一个二维的数组,第一维称为key,第二维称为target.使用这种方式可以处理多 ...
 - win8 VS控件信息
			
<TextBlock x:Name="button_1" HorizontalAlignment="Center" TextWrapping=" ...
 - 《学习OpenCV》中求给定点位置公式
			
假设有10个三维的点,使用数组存放它们有四种常见的形式: ①一个二维数组,数组的类型是CV32FC1,有n行,3列(n×3) ②类似①,也可以用一个3行n列(3×n)的二维数组 ③④用一个n行1列(n ...
 - webstorm启动bug
			
场景描述: win10系统下,webstorm(32位)经常遇到无法启动的情况. 解决方案: 重启电脑. 1.win10系统需要更新时,webstorm无法启动,此为win10 bug,重启时,系统自 ...