AOP与OOP的关系
OOP为面向对象编程,通过封装、继承、多态三大特性,大大提高了代码的可重用性,OOP是一种面向对象的程序设计模式。但如果我们要在多个不具有继承关系的多个类之间的某些方法中引入相同的业务逻辑比如打印日志,这时候OOP就显得无能为力了。即使使用了继承的方式实现了代码的重用,但依然需要把日志代码分散在不同的方法中,这就造成了代码重复度高以及代码的可维护性差。针对这种情况引入了面向切面编程的概念,把分散在不同方法中的逻辑代码提取出来,然后在程序编译或者运行的时候再放到对应的方法中。AOP是对OOP的补充与完善。
AOP思想提取的核心概念
Concern(关注点):一个concern可以是一个特定的问题,概念,或者应用程序必须要达成的目标。在大多数应用中,日志应用、安全监测、事物回滚等都是关注点,如果一个关注点的代码被多个类或者方法引用,这个关注点就称为 Crosscutting Concern(横切关注点)。
Joinpoint(连接点): 用来定义程序在什么地方能通过AOP加入额外的逻辑。
Advice(通知): 在某一个特定的joinpoint处运行的代码称为advice,常用的通知类型有
Before Advice ,After Advice以及Around Advice。
Pointcut(切入点): 定义了通知要应用的连接点。通常这些pointcut指的是类与方法名。如某个通知要运用于以method开头的方法中,那么满足这个规则的所有方法都是切入点。
**Aspect(方面):**advice与pointcut的组合被称为aspect。这个组合中定一个相关业务逻辑以及何时执行这些业务逻辑。一个方面是对一个横切关注点的模块化,它将零散的关注点代码进行了整合。
Weaving(织入): 在目标对象中插入方面代码的过程叫做织入。织入可以在编译或者运行的时候进行。
Spring AOP中的通知类型
通知名称 | 说明 |
---|---|
BeforeAdvice(前置通知) | 前置通知可以在目标方法执行之前进行自定义的操作,可以修改传递给目标方法中的参数,可以抛出一个异常来阻止目标方法的执行 |
AfterReturningAdvice(后置通知) | 后置通知在目标方法执行之后并且已经有返回时运行。后置通知可以访问目标方法,以及该方法的参数以及返回值 |
MethodInterceptor(环绕型通知) | 它可以在目标方法的前后执行,也可以定义具体在什么时候调用目标方法,环绕通知可以修改目标方法的返回值。如果需要,可以另写业务逻辑而不调用目标方法 |
ThrowAdvice(抛出通知) | 它在目标方法抛出异常的后执行,抛出通知可以只捕获特定的异常。异常通知常常被用于日志管理,当程序在执行的过程中发生异常时,此时需要执行事务回滚 |