关于AOP的种种疑问
最近在用AOP做一个小东西,于是开始翻阅一些AOP的资料,中间解决了自己的一些疑问,记录下来。
什么是AOP?
其实早就知道呵呵,这里作为引子吧。AOP是面向切面的编程。最大的好处就是对于已有的系统弱侵入。
现在用处比较多的就是数据库事务管理、日志处理、性能监控等等方面。因为这些东西足够公共,可以抽取出来,减少对于系统的侵入。
AOP的主要原理是啥?
动态代理,原有的类不做改变,构造出另外一个类来代理这个类的行为,在这个新类中添加逻辑。JDK在很早的版本就提供了动态代理功能,
目前还有比较出名的Cglib,这里就不再展开讨论。
现在AOP有哪些实现?
设计的目标是把横切的问题模块化,目前来看主要有四个实现。
Aspect:语言级AOP的实现,扩展了Java语言,能够在编译期间提供模块代码的植入;
AspectWerkz:基于java的简单、动态、轻量级的框架,支持运行期间和编译期间的植入;
JBoss AOP:JBoss应用服务器框架扩展的一个功能;
Spring AOP:使用纯java语言实现,不需要专门的编译过程和类加载器,在运行期间通过代理向目标类提供增强;
那Spring中AOP使用是咋回事情呢?
Spring长处并不是提供一个完整的Aop实现,它的长处就是整合其他各类AOP的实现。
Spring在2.0之后,对于AOP的功能进行了重要的增强。
1、新增加了基于Schema的配置支持,为AOP提供了命名空间;
2、增加了对于Aspect切点表达式语言的支持;
3、可以无缝的集成Aspect;
对于JDK5的项目,推荐使用Spring中提供的@Aspect的配置方式,因为可以更简单更直接的应用切面;
AOP的几个关键术语?
JoinPoint:程序执行的特定位置,具有边界性质的特点,例如方法执行前,方法执行后;
PointCut:通过PointCut来定位JoinPoint,数据库的概念来描述最为清楚,JoinPoint相当于数据库中的记录,PointCut相当于查询条件;
Advice:植入到目标类连接点上的一段程序代码;
Target:增强逻辑要植入的目标类;
Introduction:引介是一种特殊的增强,为类添加一些属性和方法;
Weaving:将增强添加到目标类连接点上的过程;
Aspect:切面有切点和增强组成;
Spring中使用AOP有几种方式?
1、基于Advisor类的方式;
2、基于@Aspect的方式;
3、基于<aop:advisor>的方式(一种混血儿呵呵);
4、基于<aop:aspect>的方式;
Spring提供了很多选择,都得选择确实让人头疼。
如果是JDK5的工程,优先推荐@Aspect的方式,如果是低版本的JDK,则可以使用<aop:aspect>的方式;
如果是老系统改造,可以使用<aop:advisor>来复用之前的Advice类,如果是低版本的Spring,则只能只用Advisor类了;
Spring有哪几种增强形式?
五种,前置、后置、环绕、异常抛出、引介(增加方法和属性);
参考书籍《spring 3.X企业应用开发实战》