Skip to content

Latest commit

 

History

History

aop-demo

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 

注解方式的AOP实现

AOP好比微创手术刀,在病人的病灶的位置划开口子,进行治理

1、常规实现

1.1、基于XML配置

SpringBoot的流行趋势,已经开始走向基于注解的自动化配置,已经做到无XML配置文件。所以这里就不介绍XML方式的开发。

1.2、基于Aspect注解

1.2.1、Jar依赖

这里使用spring-boot-starter-aop,具体版本号跟随spring-boot-starter-parent定义。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

1.2.2、切面

切面 = 切点(Pointcut) + 通知(BeforeAfterAfterReturningAroundAfterThrowing)

  • 切点支持:基于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 调用后逻辑
    }
}

2、使用场景

1、批量进行拦截处理,调用方法有统一规则的类全名

2、对个别方法进行拦截,对应类名没有规则