spring切入点怎么写

不及物动词 其他 46

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring切入点是AOP(Aspect-Oriented Programming,面向切面编程)的重要组成部分,可以用于定义在哪些方法上添加切面逻辑。下面以Java配置方式为例,介绍Spring切入点的写法。

    首先,我们需要创建一个切入点表达式,用来匹配目标方法。切入点表达式是一个字符串,其中包含了切入点匹配的规则。Spring切入点支持多种匹配规则,如方法名、类名、参数类型等。下面是几个常用的切入点表达式示例:

    1. 匹配指定包下的所有方法:execution(* com.example..(..))
      该表达式匹配了包名为com.example下的所有方法,不论方法的返回值类型和参数类型。

    2. 匹配指定类中的所有方法:execution(* com.example.UserDao.*(..))
      该表达式匹配了com.example包中的UserDao类中的所有方法,不论方法的返回值类型和参数类型。

    3. 匹配指定类中的指定方法:execution(* com.example.UserDao.addUser(..))
      该表达式匹配了com.example包中的UserDao类中的addUser方法,不论方法的返回值类型和参数类型。

    4. 匹配指定类中的指定类型参数的方法:execution(* com.example.UserDao.findUserById(Long))
      该表达式匹配了com.example包中的UserDao类中的findUserById方法,且该方法的参数类型为Long。

    接下来,我们需要在切面中使用切入点表达式。切面是一个包含了通知(Advice)和切入点(Pointcut)的类。通知定义了切面逻辑,而切入点定义了切入的位置。可以使用@Aspect注解来声明一个切面类,并使用@Pointcut注解定义切入点。

    示例代码如下所示:

    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    
    @Aspect
    public class MyAspect {
        @Pointcut("execution(* com.example.*.*(..))")
        public void myPointcut() {}
    
        // 其他通知方法
    }
    

    上述示例中,通过@Pointcut注解定义了一个切入点方法myPointcut,匹配了com.example包下的所有方法。接下来可以在该切入点上面定义其他通知方法,如前置通知、后置通知、异常通知等,以实现特定的切面逻辑。

    最后,在需要使用切面的地方使用@Autowired注解或者通过配置文件引入切面类,并在目标方法上添加切入点注解,如@Before、@After等,表示在目标方法执行之前或之后执行相应的切面逻辑。

    以上就是Spring切入点的写法示例,通过定义切入点表达式和使用切面类,我们可以很方便地在Spring中实现AOP编程。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    在Spring框架中,切入点(Pointcut)用于定义在哪些方法或者类上应用切面(Aspect)的通知(Advice)。切入点表达式可以使用Spring中的AspectJ风格或者正则表达式风格来定义。下面是几种常见的Spring切入点表达式的写法:

    1. 使用AspectJ风格的切入点表达式:
      使用AspectJ语法的切入点表达式可以使用“execution”关键字来定义,通常为“访问修饰符 返回类型 包名.类名.方法名(参数列表)”的形式。

      示例:

      @Pointcut("execution(public * com.example.package.*.*(..))")
      public void myPointcut() {
      }
      
    2. 使用正则表达式风格的切入点表达式:
      Spring也允许使用正则表达式的形式来定义切入点。可以使用“bean()”、“within()”、“target()”等函数来定义切入点的作用范围。

      示例:

      @Pointcut("bean(*Service)")
      public void myPointcut() {
      }
      
      @Pointcut("within(com.example.package..*)")
      public void myPointcut() {
      }
      
      @Pointcut("target(com.example.package.MyService)")
      public void myPointcut() {
      }
      
    3. 使用逻辑运算符组合切入点表达式:
      可以使用逻辑运算符“&&”、“||”和“!”来组合切入点表达式,实现更加灵活的切入点定义。

      示例:

      @Pointcut("execution(public * com.example.package.*.*(..)) && !(execution(* com.example.package.MyService.doSomething(..)))")
      public void myPointcut() {
      }
      
    4. 引用其他切入点:
      可以通过“@Pointcut”注解引用其他切入点,实现切入点的复用。

      示例:

      @Pointcut("execution(public * com.example.package.*.*(..))")
      public void myPointcut1() {
      }
      
      @Pointcut("execution(* com.example.package.MyService.doSomething(..))")
      public void myPointcut2() {
      }
      
      @Pointcut("myPointcut1() && !myPointcut2()")
      public void myPointcut() {
      }
      
    5. 使用自定义注解定义切入点:
      可以通过自定义注解来定义切入点,然后使用“@annotation()”函数来匹配被注解的方法或类。

      示例:

      @Retention(RetentionPolicy.RUNTIME)
      @Target(ElementType.METHOD)
      public @interface MyAnnotation {
      }
      
      @Pointcut("@annotation(com.example.package.MyAnnotation)")
      public void myPointcut() {
      }
      

    以上是几种常见的Spring切入点表达式的写法,可以根据实际需求选择合适的方式来定义切入点。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring框架提供了AOP(面向切面编程)功能,其中的一个关键概念是切入点(Pointcut)。切入点指定了在哪些方法上应用切面逻辑。下面将从方法、操作流程等方面来讲解Spring切入点的编写。

    1. 方法级别的切入点
      方法级别的切入点指定了在哪些方法上应用切面逻辑。可以通过以下几种方式来编写方法级别的切入点。

    1.1 使用表达式
    Spring框架中的切入点表达式可以使用AspectJ切入点表达式语言来编写。可以使用运算符、关键字和通配符来描述切入点的匹配规则。

    比如,可以使用如下表达式来指定切入点:

    @Pointcut("execution(* com.example.service.*.*(..))")
    private void pointcut() {}
    

    上面的表达式意味着匹配com.example.service包下的所有类的所有方法。

    1.2 使用注解
    Spring框架还提供了使用注解的方式来标识切入点。可以通过自定义注解的方式将切入点与方法关联起来。

    首先,在自定义注解上添加@Pointcut注解,指定切入点表达式,例如:

    @Pointcut("execution(* com.example.service.*.*(..))")
    public void customPointcut() {}
    

    然后,在切面中使用这个自定义注解来定义切入点,例如:

    @Around("@annotation(com.example.annotation.MyCustomAnnotation)")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        // 切面逻辑
        return joinPoint.proceed();
    }
    

    上面的代码表示在标记了@MyCustomAnnotation注解的方法上应用切面逻辑。

    1. 类级别的切入点
      类级别的切入点用于指定在哪些类上应用切面逻辑。通常可以使用正则表达式来描述类的匹配规则。

    例如,可以使用如下的切入点表达式来指定在所有以Service结尾的类上应用切面逻辑:

    @Pointcut("within(com.example.service.*Service)")
    private void pointcut() {}
    

    上面的表达式意味着匹配com.example.service包下所有以Service结尾的类。

    1. 组合切入点
      可以使用&&、||、!等逻辑操作符来组合多个切入点表达式。

    例如,可以使用如下的切入点表达式来同时匹配以Service结尾的类和使用@Transactional注解的方法:

    @Pointcut("within(com.example.service.*Service) && @annotation(org.springframework.transaction.annotation.Transactional)")
    private void pointcut() {}
    

    上面的表达式意味着匹配同时满足两个条件的方法。

    1. 使用切入点
      定义好了切入点后,可以在切面中使用切入点。使用@Pointcut注解来指定切入点的名称,然后在切面方法上使用@Around、@Before、@After等注解来指定切入点的逻辑。

    例如,可以使用@Around注解来在切入点周围执行切面逻辑:

    @Around("pointcut()")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        // 切面逻辑
        return joinPoint.proceed();
    }
    

    上面的代码表示在指定的切入点上应用切面逻辑。

    以上就是关于Spring切入点的编写的方法和操作流程的介绍。希望对你有帮助!

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部