AOP(Aspect Oriented Programming)面向切面编程
OOP(Object Oriented Programming)面向对象编程
AOP可以说是OOP的一个补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP的结构特性决定了开发者只能定义纵向的关系,但并不适合定义横向的关系,例如日志、全局异常处理等功能代码往往横向的散布在所有对象层次中,而与它所对应的对象的业务代码毫无关系。这种散步在各处的无关代码被称为横切,在OOP设计中,会导致大量代码的重复,而且不利于各个模块的重用。
而AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。
下面我们来看下要使用AOP必须学会的几个概念
切面(Aspect)
在SpringBoot中使用@Aspect注解在类上,表示这是一个切面
通知(Advice)
通知注解使用在切面类中的方法上,有前置通知 @Before、后置返回通知 @AfterReturning、后置异常通知 @AfterThrowing、后置最终通知 @After、环绕通知 @Around
切入点(Pointcut)
当较多的通知增强方法使用相同的execution切入点表达式时,这时就可以使用AspectJ提供的@Pointcut注解。其用法是将@Pointcut注解在一个方法之上,以后所有的execution的value属性值均可使用该方法名作为切入点
连接点(Join Point)
JoinPoint代表了AOP中能够被拦截的程序执行点,通过拦截这些JoinPoint来实现横切关注点的功能。在Spring中抽象了连接点,用连接点可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。ProceedingJoinPoint是JoinPoint的子接口,它专门用于环绕通知,可以实现更加灵活和精细的环绕通知逻辑
引入(Introduction)
代表了对一个类型额外的方法或者属性的声明。Spring AOP允许引入新接口到任何被通知对象(以及一个对应实现)。比如,可以使用一个引入去使一个bean实现IsModified接口,从而简化缓存机制。(在AspectJ社区中,一个引入也称为一个inter-type declaration类型间声明)
织入(Weaving)
将切面和其他应用类型或者对象连接起来,创骗一个被通知对象。这些可以在编译时(如使用AspectJ编译器)、加载时或者运行时完成。Spring AOP,比如其他纯Java AOP框架一般是在运行时完成织入。
代理(Proxy)
是指通过AOP框架创建的对象,用来实现切面合约的(执行通知方法等等)。在Spring框架中,一个AOP代理是一个JDK动态代理或者是一个CGLIB代理