aop的概念以及与oop的区别以及为什么要用,什么时候要用,百度上各种copy的文章一大堆,就不再抄了,记录一下自己的理解
——切面用于切入方法,获取方法的一些参数,并做自定义操作。
——类似oop,是一种编程思想,如拦截器,旨在特定(有共性)的方法后,做统一的事情,如统一日志记录等。
springboot整合第三方框架aspectj进行切面注解
pom.xml引入jar spring-aop 和 aspectj
<!--spring aop --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency>
切面 TestAspect.java
package com.flysand.demo.aspect; import com.alibaba.fastjson.JSON; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; /** * @author flysand on 2019/07/16 **/ @Aspect @Component public class TestAspect { @Pointcut("execution(* com.flysand.demo.controller.AopTestController.*(..))") public void pointCut(){} @Before("pointCut()") public void beforeMethod(JoinPoint joinPoint){ // 执行方法前执行 2 System.out.println("before pointcut"); Object[] objects = joinPoint.getArgs(); if (objects.length > 0) { for (Object object : objects) { System.out.println(object); } } } @Around("pointCut()") public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { // 进入方法后最先执行 1 System.out.println("before around method "); // 执行方法 Object o = proceedingJoinPoint.proceed(); // 执行方法后执行 3 System.out.println("方法执行结果:" + JSON.toJSONString(o)); System.out.println("after around method"); return o; } @After("pointCut()") public void afterMethod(JoinPoint joinPoint) { // 方法执行完后执行 -- 不管是否抛异常,只要方法结束就执行 -- 必然执行 4 System.out.println("after method"); } @AfterReturning("pointCut()") public void afterReturning(){ // 当方法有正常返回时执行 5 System.out.println("after returning"); } @AfterThrowing("pointCut()") public void afterThrowing(){ // 当方法抛异常时执行 5 System.out.println("after throwing"); } }
所有通知都可以创建相应的切入点pointcut,也可以创建一个公共的切入点,由其他通知分别调用
各种通知的执行顺序:其中 around、before、after为永远执行的通知方法,afterReturning为正常返回时执行,afterThrowing为异常返回时执行