当前位置: 首页 > 知识库问答 >
问题:

Spring AspectJ关于CrudRepository和Annotation的切入点

籍辰沛
2023-03-14

我有@tenatable注释来决定切入点:

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

这是我的观点:

 @Slf4j
    @Aspect
    @Configuration
    public class TenancyAspect {

        @Pointcut("execution(public * *(..))")
        public void publicMethod() {}

        @Around("publicMethod() && @within(com.sam.example.aspect.aspectexample.model.Tenantable)")
        public Object tenatable(ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("my operations ...");
            return joinPoint.proceed();
        }
    }

这对于这个服务类来说没有任何问题:

@Tenantable
@Service
public class MyService(){
    public void doSomething(){
            ...
    }
}

当我调用doSomething()方法时,我的方面正在运行,这没问题,但我想为属于spring数据的CrudRepository接口实现方面。

我已经改变了我的Aspect来实现这一点,如下所示:

@Slf4j
@Aspect
@Configuration
public class TenancyAspect {

    @Pointcut("execution(public * *(..))")
    public void publicMethod() {}


    @Pointcut("this(org.springframework.data.repository.Repository)")
    public void repositoryExec(){}


    @Around("publicMethod() && repositoryExec() && @within(com.sam.example.aspect.aspectexample.model.Tenantable)")
    public Object tenatable(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("my operations ...");
        return joinPoint.proceed();
    }
}

这是存储库:

@Tenantable
@Repository
public interface MyRepository extends CrudRepository{
}

但当我调用MyRepository中的任何方法时,它都不起作用。

有什么办法吗?

编辑:当我应用这些时,它适用于所有存储库:

@Pointcut("execution(public * org.springframework.data.repository.Repository+.*(..))")

并排除此:

(com.sam.example.aspect.aspectexample.model.tenatable)中的

但我需要这个涂鸦来将其应用于特定的存储库。

共有2个答案

宓跃
2023-03-14

您的repositoryExec应该以提示存储库的所有子类结束

  @Pointcut("this(org.springframework.data.repository.Repository+)")
仉嘉泽
2023-03-14

再看了看,我想我知道这里发生了什么:你假设仅仅因为你做了注释@Inherated,如果你注释了一个接口,它就会被实现类继承。但是这个假设是错误的。@继承只在一种情况下有效:当扩展一个注释的基类时。它不适用于注释的接口、方法等。这也记录在这里:

请注意,如果注释类型用于注释类以外的任何内容,则此元注释类型无效。还要注意,此元注释仅导致注释从超类继承;实现接口上的注释无效。

一旦您注释了您的实现类,它就可以工作了。

 类似资料:
  • 我使用Spring的和注释来实现一个简单的CRUD-app,可以通过RESTful API使用。现在,我想在我的存储库上添加一个AspectJ切入点,这样每当调用接口中的CRUD-method时,就会执行一些功能。 首先,我扩展了Spring的,以便在自己的接口中添加一些自定义功能: 一切都很好,我可以通过REST客户端调用这个方法。我不必实现接口,因为Spring在后面的工作中是一个奇迹。这是扩

  • 问题内容: 给定以下示例类… 以及以下Spring-AOP切入点… 对Bar实例的上述切入点应用建议的结果是什么?特别是… 我想我缺少切入点如何与继承交互的一些基本真理,因此幕后的解释/文档可能会走很长一段路。 问题答案: 从aspectj文档中: 在匹配方法执行连接点时,如果执行切入点方法签名指定了声明类型,则切入点将仅匹配该类型中声明的方法或覆盖该类型中声明或继承的方法的方法。所以切入点 执行

  • 是否有一种方法可以在类级和方法级同时提供单一的切入点和建议来支持注释?

  • 我想使用ElementType运行一个方面。参数注释,但它不起作用。从不调用about-tokenize方法。

  • 主要内容:切入点,语法,运行项目切入点(JoinPoint)代表示您的应用程序中可以插入AOP方面的某个点。 您也可以说,这是应用程序中使用Spring AOP框架执行操作的实际位置。 请考虑以下示例: 包中包含的所有方法类。 一个类的特定方法。 切入点 切入点()是一组一个或多个连接点,其中它用来执行通知。可以使用表达式或模式指定切入点,我们将在下面AOP示例中看到。 在Spring,切入点有助于使用特定的连接点来应用通知。

  • 主要内容:连接点,切入点,运行项目连接点 连接点()代表您的应用程序中可以插入AOP方面的一个点/位置。 您也可以说,这是应用程序中使用Spring AOP框架执行操作的实际位置。 请考虑以下示例: 包中包含的所有方法类。 一个类的特定方法。 切入点 切入点()是一组一个或多个连接点,在其中应该执行的通知。 您可以使用表达式或模式指定切入点,我们将在AOP示例中看到。 在Spring中切入点有助于使用特定的连接点来应用通知。 请考