spring中perthis怎么使用

fiy 其他 43

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    在Spring框架中,可以使用@Aspect注解和@Pointcut注解来实现切面编程。其中,@Aspect注解用于定义一个切面,@Pointcut注解用于定义切入点的位置。当需要自定义切入点的位置时,可以使用@Pointcut注解的perthis属性。

    使用perthis属性,可以根据调用者对象来创建新的切面实例,并为每个调用者对象维护一个切面实例。这样,在每个调用者对象上执行切面逻辑时,都是通过独立的切面实例来完成的。

    具体使用perthis属性的步骤如下:

    1. 创建一个切面类,使用@Aspect注解进行标记。
    @Aspect
    public class MyAspect {
      ...
    }
    
    1. 在切面类中定义一个切入点,使用@Pointcut注解进行标记,并设置perthis属性。
    @Pointcut(value = "execution(* com.example.MyClass.myMethod(..))", perthis = "myAspect()")
    public void myPointcut() {
    }
    
    @Pointcut(value = "this(com.example.MyClass)", perthis = "myAspect()")
    public void myPointcut2() {
    }
    
    @Pointcut(value = "target(com.example.MyClass)", perthis = "myAspect()")
    public void myPointcut3() {
    }
    
    @Pointcut(value = "args(java.lang.String)", perthis = "myAspect()")
    public void myPointcut4() {
    }
    
    @Pointcut(value = "bean(myBean)", perthis = "myAspect()")
    public void myPointcut5() {
    }
    
    1. 在切面类中定义一个返回切面实例的方法,方法名和返回值类型与@Pointcut注解中的perthis属性值保持一致。
    @Lazy
    @Scope(value = "prototype")
    @Aspect
    public class MyAspect {
      @Bean
      public MyAspect myAspect() {
        return new MyAspect();
      }
    }
    
    1. 在切面类中定义切面逻辑的方法,并使用@Before、@After、@Around等注解进行标记。
    @Before("myPointcut()")
    public void beforeAdvice() {
      System.out.println("Before advice");
    }
    
    @After("myPointcut()")
    public void afterAdvice() {
      System.out.println("After advice");
    }
    
    @Around("myPointcut()")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
      System.out.println("Before advice");
      Object result = joinPoint.proceed();
      System.out.println("After advice");
      return result;
    }
    
    1. 在目标方法上使用切面,使用@Aspect注解对应的切入点。
    @Service
    public class MyClass {
      @MyAspect.myPointcut
      public void myMethod() {
        ...
      }
    }
    

    通过上述步骤,就可以在Spring框架中使用perthis属性来设置切入点的位置,并实现切面编程。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在Spring框架中,使用@AspectJ注解支持方式实现面向切面编程(AOP)是常见的做法。@AspectJ注解提供了一组注解,其中之一是@Aspect,用于声明一个切面。在使用@AspectJ注解时,我们可以使用@Pointcut注解来定义切入点,然后使用@Before、@After、@Around等注解定义通知,完成具体的切面逻辑。

    在切面编程中,一个常见的需求是控制方法的执行时间或者控制方法的执行频率。Spring中的@AspectJ提供了@Around、@Before、@After等注解来实现这些需求,其中包括了@Perthis注解。

    @Perthis注解用于指定一个实例级别的切入点表达式,表示只有满足特定条件的对象才会被通知拦截。具体实现方式如下:

    1. 在切面类上添加@Aspect注解,声明一个切面。
    2. 使用@Pointcut注解定义切入点表达式,例如"@Pointcut("execution(* com.example.service..(..))")"。
    3. 使用@Before、@After或者@Around等注解定义通知,例如"@Around("@annotation(perthisMethod)")"。
    4. 在通知方法中,可以使用@Perthis注解来指定一个实例级别的切入点表达式,例如"@Perthis("execution(* com.example.service..(..))")"。
    5. 在被通知的方法中,可以使用@Before或者@After等注解来指定被通知的方法执行前后的逻辑。

    需要注意的是,在使用@Perthis注解时,需要将切面类定义为原型范围(Prototype Scope),以确保每个被通知的对象都使用相应的切面。

    使用@Perthis注解的一个示例代码如下所示:

    @Aspect
    @Component
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public class MyAspect {
        
        @Pointcut("execution(public void com.example.service.UserService.addUser(..))")
        private void myPointCut() {}
        
        @Around("@annotation(perthisMethod)")
        public Object performAction(ProceedingJoinPoint joinPoint, PerthisMethod perthisMethod) throws Throwable {
            // 在通知方法中,可以根据@Perthis注解的切入点表达式来控制被通知方法的执行逻辑
            if (perthisMethod.value()) {
                // 执行被通知方法的逻辑
                return joinPoint.proceed();
            }
            
            // 被通知方法的逻辑被忽略
            return null;
        }
        
        @Before("@annotation(perthisMethod)")
        public void doSomething(JoinPoint joinPoint, PerthisMethod perthisMethod) {
            // 在通知方法中,可以根据@Perthis注解的切入点表达式来执行before通知的逻辑
            if (perthisMethod.value()) {
                // 执行before通知的逻辑
            }
        }
    }
    

    上述代码中,一个切面类MyAspect被声明为一个切面,使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)注解将切面类定义为原型范围。@Pointcut注解定义了一个切入点表达式myPointCut,用于匹配com.example.service.UserService类中的addUser方法。@Around和@Before注解分别定义了一个环绕通知和一个前置通知,根据@Perthis注解的切入点表达式来控制通知逻辑的执行。

    使用@Perthis注解的场景包括但不限于:

    • 控制方法的执行时间。
    • 控制方法的执行频率。
    • 控制方法的访问权限。
    • 控制方法的并发性。
    • 控制方法的事务提交等。

    总之,@Perthis注解可用于细粒度地控制实例级别的切入点表达式,从而实现更灵活的切面编程需求。

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

    在Spring框架中,@AspectJ注解提供了一种声明式的方式来让开发者使用切面编程。其中之一就是通过使用@Pointcut注解定义切入点表达式,通过使用@Aspect注解将该类声明为一个切面,再通过使用不同的增强类型的注解(例如@Before、@After等)来指定具体的切面操作。

    Perthis是AspectJ中的一个增强类型,它在Spring AOP中也得到了支持。通过使用@Aspect注解和@Pointcut注解,我们可以在Spring中使用Perthis增强类型来定义切面。下面是具体的操作流程:

    1. 导入Spring AOP和AspectJ相关的依赖。

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-aop</artifactId>
      </dependency>
      <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
      </dependency>
      
    2. 创建切面类,使用@Aspect注解来声明为一个切面。

      @Aspect
      public class MyAspect {
          // 在切面中定义切入点表达式
          @Pointcut("execution(public void com.example.MyClass.myMethod())")
          public void myPointcut() {}
      
          // 使用增强类型注解定义切面操作
          @Before("myPointcut() && perthis(execution(public void com.example.MyClass.myMethod()))")
          public void beforeAdvice() {
              // 在方法执行之前执行的操作
          }
      }
      
    3. 配置Spring AOP,将切面类注册到容器中。

      @Configuration
      @EnableAspectJAutoProxy
      public class AopConfig {
          @Bean
          public MyAspect myAspect() {
              return new MyAspect();
          }
      }
      
    4. 在需要应用该切面的类或方法上使用Spring的组件注解,如@Service、@Component等。

      @Service
      public class MyClass {
          public void myMethod() {
              // 方法体
          }
      }
      

    通过以上步骤,我们就完成了在Spring中使用Perthis增强类型的操作。在该示例中,使用@Pointcut注解定义了一个切入点表达式,使用@Perthis注解和@Before注解定义了一个增强类型为Perthis的切面操作,在方法执行前执行。你可以根据自己的需求调整切入点和切面操作的位置、条件等。

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

400-800-1024

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

分享本页
返回顶部