1.概念
AOP (Aspect-Oriented Programming),即面向切面编程,是一种编程思想,目前实现AOP的有Spring、AspectJ、JBoss等技术。我们知道,面向对象思想可以很好的处理业务流程,但不能把系统某些特定重复性的行为封装的模块中。例如:操作日志,我们不得不在业务流程中嵌入大量的日志记录代码,这样维护起来十分复杂,系统的复杂性和代码的重复性也大大增加,从而使bug发生率也大大增加。
AOP可以很好的解决这个问题,例如:利用AOP我们可以专门独立出一个日志记录的模块完成记录代码的任务,而不是在实现业务代码时嵌入日志记录代码,实现业务代码与非业务代码分别维护。AOP的常见应用:日志拦截,授权认证,数据库的事务拦截和数据审计等等。
AOP中常用术语:
连接点(join point):在程序执行过程中某个特定的点,通常在这些点需要添加关注的功能。比如:方法之前或之后或抛出异常时都可以是连接点,Animal类的move()方法之前是一个连接点,一个连接点总是代表一个方法的执行,表示"在哪里做";
切面(aspect):将各个业务对象之中的关注点收集起来,设计成独立、可重用、职责清楚的对象,成为切面。
2.原理
AOP的实现主要使用了代理模式,AOP框架可以自动创建代理。代理分为静态代理和动态代理两大类,动态代理又分JDK动态代理和CGLib动态代理,Spring AOP就是使用的动态代理,Spring AOP框架对AOP代理类的处理原则:如果目标对象实现了接口,Spring AOP 将会采用JDK动态代理生成代理类;如果目标对象没有实现接口,Spring无法使用JDK动态代理,将会采用CGLib来生成AOP代理类,不过这个选择过程对开发者完全透明,开发者无需关心。
下面介绍这两种方式:
JDK动态代理:
目标对象实现了若干接口,使用java.lang.reflect.Proxy类代理
需要创建接口,被代理类,代理类,测试类。代理由JDK提供,此外还需创建拦截器用以处理代理类方法的调用及增加非业务功能。