refer: spring-aop-tutorial

通知、连接点、切入点

连接点JoinPoint:程序运行中的一个点,通常代表一个方法的执行。(有多个,但是同一时间运行一个连接点)

如@Log指定的一个真实运行的方法

切入点PointCut:符合连接点的断言或表达式

如任何@Log标注的方法

通知Advice:和切入点表达式相关联,运行在任何符合切入点的连接点处。

各种通知,也是方法。

Spring默认使用AspectJ切入点表达式。
AOP学习笔记 - 图1

开始写

依赖

springboot里不用自己加

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-context</artifactId>
  4. <version>5.2.7.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring-context-support</artifactId>
  9. <version>5.2.7.RELEASE</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework</groupId>
  13. <artifactId>spring-aop</artifactId>
  14. <version>5.2.7.RELEASE</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.aspectj</groupId>
  18. <artifactId>aspectjrt</artifactId>
  19. <version>1.9.5</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.aspectj</groupId>
  23. <artifactId>aspectjweaver</artifactId>
  24. <version>1.9.5</version>
  25. </dependency>

开启AOP

@Configuration
@EnableAspectJAutoProxy
public class AopConfig {

}

写切面和切入点

@Aspect
public class EmployeeCRUDAspect {

    @Before("execution(* EmployeeManager.getEmployeeById(..))")         //point-cut expression
    public void logBeforeV1(JoinPoint joinPoint)
    {
        System.out.println("EmployeeCRUDAspect.logBeforeV1() : " + joinPoint.getSignature().getName());
    }
}

写个方法(符合切入点的)

@Component
public class EmployeeManager
{
    public EmployeeDTO getEmployeeById(Integer employeeId) {
        System.out.println("Method getEmployeeById() called");
        return new EmployeeDTO();
    }
}

logBeforeV1会在getEmployeeById前执行,因为getEmployeeById符合了切入点表达式。

输出:

EmployeeCRUDAspect.logBeforeV1() : getEmployeeById
Method getEmployeeById() called