AOP好比微创手术刀,在病人的病灶的位置划开口子,进行治理
SpringBoot的流行趋势,已经开始走向基于注解的自动化配置,已经做到无XML配置文件。所以这里就不介绍XML方式的开发。
这里使用spring-boot-starter-aop
,具体版本号跟随spring-boot-starter-parent
定义。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
切面 = 切点(Pointcut
) + 通知(Before
、After
、AfterReturning
、Around
、AfterThrowing
)
- 切点支持:基于
execution
表达式、某个注解 - 切面支持:基于
Aspect
基于execution
表达式切面例子
@Aspect
@Component
public class LoggerHandler {
@Pointcut("execution(* org.linbo.demo.aop.service.*.*(..))")
public void log(){}
@Around(value = "log()")
public void doLog(ProceedingJoinPoint pjp) throws Throwable {
// TODO 调用前逻辑
pjp.proceed();
// TODO 调用后逻辑
}
}
简化版例子
@Aspect
@Component
public class LoggerHandler {
@Around(value = "execution(* org.linbo.demo.aop.service.*.*(..))")
public void doLog(ProceedingJoinPoint pjp) throws Throwable {
// TODO 调用前逻辑
pjp.proceed();
// TODO 调用后逻辑
}
}
基于annotation
切面例子
@Aspect
@Component
public class LoggerHandler {
@Around("@annotation(bizLog)")
public Object around(ProceedingJoinPoint pjp, InterfaceCallLogger bizLog) throws Throwable {
// TODO 调用前逻辑
pjp.proceed();
// TODO 调用后逻辑
}
}