您的位置:首页 > 编程语言 > Java开发

【Spring源码--AOP的实现】--综述

2016-08-31 14:41 344 查看

前言:

相比于IOC的源码,AOP的源码更为抽象一点。因为我们在读IOC源码,可以根据我们的Bean配置,去相结合着思考和理解,而AOP的是一个切面的概念,所生成的代理对象也不是我们说看到就看到的,相对抽象一点,但是AOP的源码相对于IOC的源码少了很多。所以我们在读AOP源码的时候,应该先把整个流程快速的读通,再去一点点具体到方法,再者就是自己动手写demo。那么,本文作为AOP的综述,主要写一些基本概念及AOP的整体设计流程。

AOP的基本概念:

Advice:通知,定义在指定连接点上做什么内容。是AOP联盟定义的一个接口,SpringAOP在实现中提供了更多的具体通知类型,如BeforeAdvice、AfterAdvice、ThrowsAdvice等。
Pointcut:切点,符合切点表达式的连接点,也就是被真正切入的地方。
Aspect:切面,切入系统的一个切面,比如事物管理是一个切面,权限管理是一个切面。
Join point:连接点,进行横向切入的位置。

AOP的理解:

Spring AOP是基于JDK动态代理和CGLIB(动态字节码增强技术)实现的,在方法执行的前后进行拦截。
对于AOP的理解,可以引用网友的一段话:
aop切面编程就是在常规的执行java类中方法前或执行后加入自定义的方法。比如你本来每天都去打酱油,去,打酱油,回。现在我每天在你打酱油路上等着,你去打酱油的时候我打你一顿,回来的时候给你点糖果吃。你根本不知道为什么我会在路上拦住打你。所以在切面中插入你自定义的方法,这个方法的执行和本身要执行的类方法无关系,也就是不是这个类的方法来调用你写的方法的,你写的方法什么时候执行都是要通过在配置指定。我打完你,你该打酱油还是去打酱油,当然我如果是拦住你让你酱油打少点,你打酱油的时候还是会打那么多,但是在你打完酱油回来的时候我可以把你的酱油倒些出去,所以嵌入的自定义方法对要调用的类方法本身没有影响,但是可以操纵这个方法的返结果或者处理结果。

AOP的设计分析:

虽然对于我们使用者来说,只需要进行简单的配置即可使用SpringAOP,但仔细分析其内部实现可以看到,这里面还是有挺复杂的一个过程。如图所示:


上面这个图大概解释了aop的一个实现过程,具体的细节还是有很多的,这里只是给大家理解一个整体流程。具体我们后面会分析代码,也就是按照这个顺序。

AOP的配置方式:

一般可以有以下几种方式,其中<aop:config>用的最多,AspectJ的注解用的也还好,ProxyFactoryBean就相对麻烦点,不过是最基本的,最好理解AOP原理的,根据项目不同进行选择。

配置ProxyFactoryBean,显式地设置advisors, advice, target等

通过<aop:config>来配置

通过<aop:aspectj-autoproxy>来配置,使用AspectJ的注解来标识通知及切入点

AOP的应用场景:

应用场景体现在两个方面:一是应用可以直接使用AOP的功能,设计应用的横切关注点,把扩约应用程序多个模块的功能抽象出来,并通过简单的AOP的使用,灵活的编制到模块中,比如:日志记录的功能。另一方面,在Spring内部,一些支持模块也是利用Spring AOP来实现的,如:事务处理。根据网上的网友总结,大概可以用用到一下几个方面:

Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging  调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence  持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务

关于SpringAOP综述,大概就介绍这些内容,后续我会跟着上面的流程图,先以ProxyFactoryBean的配置为例,进行源码的走读。后面再去了解下<aop:config>这样的配置是如何实现的AOP。题外话:最近手头有项目了,可能博客内容更新会稍微慢点!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: