spring aop切入点汇总

 需引入jar包
 
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

1、execution

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)

modifiers-pattern:修饰符;方法的修饰符,public, private, protected。可选
ret-type-pattern:返回值类型;方法的返回值。必选,一般用 * 号 任意类型,也可以是具体类型。
declaring-type-pattern:类信息;具体哪些类。可选
name-pattern:名称;方法的名称。必选
param-pattern:参数;方法的参数。必选
example: ()匹配一个不带参数的方法,(..)匹配任意数量(零个或更多)的参数。(*)模式匹配采用任何类型的一个参数的方法。(*,字符串)匹配接受两个参数的方法。第一个可以是任何类型,而第二个必须是字符串。
throws-pattern:异常;方法抛出的异常。可选


..:表示匹配方法中的任意数量和类型的参数,或者匹配类下的任意包;
+:表示匹配给定类的任意子类;
*:表示匹配任意数量的字符.
案例
@Slf4j
@Aspect
@Component
public class PointcutAspect {
    @Pointcut("execution(* com.generator.service..*.*(..))")
    private void aspect() {}
    
    @Around("aspect()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        log.info("执行前...");
        Object proceed = pjp.proceed();
        log.info("执行后...");
        return proceed;
    }
}

@Service
public class UserServiceImpl  extends ServiceImpl<UserDao, User> implements IUserService {
   @Override
    public void updUser() {
        System.out.println("updUser");
    }
}

within

within(<type name>)  匹配接口、类和包。
// 匹配 com.example.dao 包下的所有类的所有方法,但不包括子包的类
@Pointcut("within(com.generator.dao.*)")

// 匹配 com.example.dao 包及其子包中所有类中的所有方法
@Pointcut("within(com.generator.dao..*)")

// 匹配 com.example.dao 包下的 UserDaoImpl 类的所有方法
@Pointcut("within(com.generator.dao.UserDaoImpl)")

// 匹配当前包下的 UserDaoImpl 类的所有方法
@Pointcut("within(UserDaoImpl)")

// 匹配所有实现 com.example.dao 包下的 UserDao 接口的类的所有方法
@Pointcut("within(com.generator.dao.UserDao+)")

bean

指示符用于匹配特定名称的 Bean 对象的方法,是 SpringAOP 扩展的指示符。
//匹配名称中带有后缀 Service 的 Bean 的所有方法
@Pointcut("bean(*Service)")

this

this(全限定类名)
匹配的是AOP代理对象,也就是说当前执行的AOP代理对象是this中指定的类型那么就进行织入。

spring:
  aop:
    proxy-target-class: false
false:使用jdk代理。
true:使用cglib代理;默认为true。
当设置为false,织入失败。当设置为true,织入成功。

target

target(全限定类名)
用于匹配当前目标对象类型的方法。
不管全限定类是接口还是实现类,不管是jdk还是cglib都会成功。因为targe指向的是当前的对象。
args指示符
@Pointcut("execution(* com.generator..*.*(..)) && args(java.lang.String, ..)")
匹配第一个参数是String类型的方法。

定义注解

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Ann {
}

@within指示符

@Service
@Ann
public class UserServiceImpl {}

@Pointcut("@within(com.generator.Ann)")
匹配所有类上具体指定了注解的类内的所有方法。

@target指示符

@Pointcut("execution(* com.generator..*.*(..)) && @target(com.generator.Ann)")
匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解

@args指示符

@Ann
public class PersonTest {
  //省略
}

@Pointcut("execution(* com.generator..*.*(..)) && @args(com.generator.Ann)")

@annotation指示符

@Pointcut("@annotation(com.generator.Ann)")


@Override
@Ann
public void updUser() {
    System.out.println("updUser");
}
五种通知

before(前置通知) @Before 通知方法在目标方法调用之前执行
after(后置通知) @After 通知方法在目标方法返回或异常后调用
after-returning(返回通知) @AfterReturning 通知方法会在目标方法返回后调用
after-throwing(异常通知) @AfterThrowing 通知方法会在目标方法抛出异常后调用
around(环绕通知) @Around 通知方法会将目标方法封装起来

@AfterReturning(value = "aspect()", returning = "result")
public void after(Object result) {
}

@AfterThrowing(value = "aspect()", throwing = "ex")
public void after(Throwable ex) {
    ex.printStackTrace();
}
支持的运算符来组合切入点表达式

&&:要求连接点同时匹配两个切入点表达式
||:要求连接点匹配任意个切入点表达式
!::要求连接点不匹配指定的切入点表达式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值