Spring采用动态代理的方式实现AOP,具体采用了JDK的动态代理和CGLib的动态代理。使用动态代理的目的是在现有类的基础上增加一些功能。简单地将就是有一个Proxy类,实现了原始类的方法,并且在原始类的基础上增加了新的功能。
假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如
但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。
但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。
通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。
AOP编程属于
1.切面 Aspect
切面泛指交叉的业务逻辑。常用的切面有通知和顾问。实际上就是对主业务逻辑的增强。
2.织入 Weaving
织入是指将切面代码插入到目标对象的过程。
3.连接点 JoinPoint
连接点是指可以被切面织入的方法。通常业务接口的方法均为连接点。
4.切入点 Pointcut
切入点是指切面具体织入的方法。
5.目标对象 Target
目标对象指将要被增强的对象,即包含主业务逻辑的类的对象。
7.通知 Advice
通知是切面的一种实现,可以完成简单的织入功能。通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.
8.顾问
顾问是切面的另一种实现,能够将通知以更为复杂的方式织入到目标对象中,试讲通知包装为更复杂的切面的装配器。
AOP的实现方式: