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框架系列 ...
随机推荐
- (六) 6.2 Neurons Networks Backpropagation Algorithm
今天得主题是BP算法.大规模的神经网络可以使用batch gradient descent算法求解,也可以使用 stochastic gradient descent 算法,求解的关键问题在于求得每层 ...
- 【Android】SDK工具学习 - Traceview 和 dmtracedump
dmtracedump官方文档 Traceview 根据程序的log,形成图形 dmtracedump [-ho] [-s sortable] [-d trace-base-name] [-g out ...
- nodejs、sass、backbone等api地址
1.nodejs Node.js v4.2.4 手册 & 文档 2.sass Sass (3.4.21) 中文文档 3.backbone Backbone.js(1.1.2) API中文文档 ...
- Ubuntu跬步之图片管理digiKam
Ubuntu下自带了Image Viewer,具备基本的图片浏览功能. 偶尔有些图片需要分组,添加标注,幻灯片浏览等,所以找了款图片管理软件digiKam. 安装 Ubuntu Software Ce ...
- Fisher information matrix笔记
在看FK论文时,fisher information matrix是必须理解的. 从维基百科查阅到,Fisher information matrix是用利用最大似然函数估计来计算方差矩阵. 来源于: ...
- 3 years in Tencent game
心里一直有继续写博文的愿望,却一直被各种借口打断,现在回头一看,已经在腾讯待了3年半之久.3年半是个比较尴尬的时间点,不好意思说自己是游戏从业老兵,但又觉得自己对于行业已经看到比较清楚了:从当年毕业时 ...
- Oracle 学习用
最近在学习Oracle数据库 ,公司用这个,学习到现在,唉!苦逼的程序员呀! 也只能在这里发发牢骚了,这个是转载的 ,发完睡觉! oracle sql语句 一.ORACLE的启动和关闭 .在单机环境下 ...
- stl 中List vector deque区别
stl提供了三个最基本的容器:vector,list,deque. vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此 它能非常好的支持随 ...
- Winsock IO模型之select模型
之所以称其为select模型是因为它主要是使用select函数来管理I/O的.这个模型的设计源于UNIX系统,目的是允许那些想要避免在套接字调用上阻塞的应用程序有能力管理多个套接字. int sele ...
- Delphi 延迟函数 比sleep 要好的多
转自:http://www.cnblogs.com/Bung/archive/2011/05/17/2048867.html //延迟函数:方法一 procedure delay(msecs:inte ...