第一,为什么需要面向方面编程?
面向对象编程的优点是显而易见的,缺点也是如此。当需要为没有继承关系的多个对象添加一个公共方法时,比如日志记录、性能监控等。,如果采用面向对象的编程方法,就需要在每个对象中添加相同的方法,从而产生大量重复的工作量和代码,不利于维护。面向方面编程是面向对象编程的补充。简单来说就是用统一的方式处理某个“刻面”问题的编程思想。如果用AOP来记录和处理日志,那么所有的日志代码都集中在一个地方,不需要在每个方法中都添加,这样就大大减少了重复代码。

二、Spring AOP术语
Spring AOP术语
通知包含需要用于多个应用程序对象的横切行为。完全无法理解,也无所谓。通俗地说,就是定义了“什么时候”和“做什么”。
连接点是程序执行期间可以应用通知的所有点。
点是定义“从哪里”切入,通知哪些连接点。很明显,切点一定是连接点。
它是截面通知和切点的组合。通知和切点一起定义了切平面的全部内容——什么,什么时候,在哪里完成功能。
Introduction允许我们向现有的类添加新的方法或属性。
编织是将切面应用到目标对象并创建新代理对象的过程。可以分为编译时编织、类加载编织和运行时编织。
三、Spring Boot AOP的实战
3.1引入依赖性
Spring Boot在使用aop时需要添加spring-boot-starter-aop依赖,如下:
spring framework . boot spring-boot-starter-AOP
不需要添加aspectjweaver的依赖,因为spring-boot-starter-aop包含aspectjweaver,版本是较新的版本。如果添加旧版本,启动时会出现错误。
Maven依赖性
3.2编写拦截bean
使用以下代码直接定义控制器:
@RestControllerpublic类AopController { @RequestMapping公共字符串say hello { system . out . println;返回;}}

3.3定义截面
Spring @AspectJ标注用于标注POJO,表示这个类不仅是POJO,还是一个切面。是切点和通知的组合,所以定义切点需要写切点和通知。在代码中,只需添加@Aspect注释。
3.3.1定义切点
切点由@Pointcut注释和切点表达式定义。
@Pointcut注释可以在切面内定义可重用的切点。
由于Spring section的粒度在最小的方法级别,并且可以用执行表达式显式地指定方法返回类型、类名、方法名、参数名等方法相关的组件,而实际中大多数需要AOP的业务场景只需要达到方法级别,所以执行表达式的应用最为广泛。它是执行表达式的语法,如图所示:
执行意味着当一个方法被执行时触发。以“”开头,表示方法返回值类型是任意类型。那么完全限定的类名和方法名," "可以表示任何类和任何方法。对于方法参数列表,可以使用“..”指示参数是任何类型。如果需要多个表达式,可以使用“”、“||”和“!”完成与、或、非运算。
切线表达式
3.3.2定义通知
有五种类型的通知,即:
预通知:在调用目标方法之前调用通知。
后通知:在目标方法完成后调用通知。
循环:在通知的方法调用前后执行自定义方法。
Return:在目标方法成功执行后调用通知。
异常通知:在目标方法抛出异常后调用通知。
代码中定义了三种类型的通知,它们使用@Before注释来标识预先通知,打印“beforeAdvice ...”,使用@After注释来标识后通知,打印“AfterAdvice ...”,使用@Around批注来标识周围的通知,在方法执行前后分别打印“before”和“after”。定义了这样一个部分,代码如下:
@ Aspect @ component public class AOP device { @ Pointcut)")public void test { } @ Before ")public void Before advice { system . out . println;} @ After public void After advice { system . out . println;} @ Around public void Around advice { system . out . println;请尝试{ proceedingJoinPoint.proceed} catch { t.printStackTrace} system . out . println;}}

3.4开始测试
完整的代码结构如图所示:
代码结构
运行AopApplication,在浏览器中访问localhost:8080/hello。毫不奇怪,控制台输出如图所示:
控制台输出结果


