refer: spring-aop-tutorial
通知、连接点、切入点
连接点JoinPoint
:程序运行中的一个点,通常代表一个方法的执行。(有多个,但是同一时间运行一个连接点)
如@Log指定的一个真实运行的方法
切入点PointCut
:符合连接点的断言或表达式
如任何@Log标注的方法
通知Advice
:和切入点表达式相关联,运行在任何符合切入点的连接点处。
各种通知,也是方法。
Spring默认使用AspectJ
切入点表达式。
开始写
依赖
springboot里不用自己加
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</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