面向切面编程,即将重复性的逻辑代码横切出来,封装称单独的类,以实现代码重用、非核心代码(如日志,性能等)和核心代码分离的作用。
横切出来的类就为切面(Aspect),一个切面包含三个内容才能发挥作用:在哪(切入点 pointcut),什么时候干什么(合为 通知Advice,其中包括方法表明干什么,注解表明什么时候(joinPoint连接点))。
-
pointcut切入点即在那个方法执行这些代码,示例:
execution("public * com.example..*.*(..) *")
语法:
execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)
还可以实现比如 set*表示set开头的方法或类。 -
advice通知(这个命名让我一脸黑人问号)
- joinPoint连接点表明什么时候,比如在方法执行前(@Before)、执行后(@After)、执行前后(@Around)、抛出异常后(After-throwing)、方法执行成功后(@After-returnning)调用。
而目标(Target)指的就是切入点所在类,给其方法添加切面这个动作即织入(weaving)。AOP的原理是动态代理,生成的代理类简称为代理(Proxy)。
示例代码:
@Component
@Aspect
public class ExampleAspect {
// 切入点
@Pointcut("execution(* com.example.Example.*(..)) || " +
"...")
public void exampleService(){}
// 通知
@Around("exampleService()")
public ResponseEntity log(ProceedingJoinPoint joinPoint) {
...
}
}
这里我们已经对于Example类的所有方法织入了log方法,ExampleAspect作为目标类将会由JDK生成动态代理类,这可以避免我们手动定义很多代理类,而重用这个切面。
网友评论