簡體   English   中英

CrudRepository 和 Annotation 上的 Spring + AspectJ 切入點

[英]Spring + AspectJ pointcut on CrudRepository and Annotation

我有 @Tenantable 注釋來決定 pointCut :

@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 接口實現方面。

我已經改變了我的方面來實現這個,如下所示:

@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+.*(..))")

並排除這個:

@within(com.sam.example.aspect.aspectexample.model.Tenantable)

但是我需要這個注釋才能將它應用於特定的存儲庫。

再看一眼,我想我知道這里發生了什么:你假設僅僅因為你做了你的注釋@Inherited ,如果你注釋一個接口,它將通過實現類來繼承。 但這個假設是錯誤的。 @Inherited僅適用於一種情況:擴展帶注釋的基類時。 它不適用於帶注釋的接口、方法等。這也記錄在此處

請注意,如果注釋類型用於注釋除類以外的任何內容,則此元注釋類型無效。 還要注意,這個元注釋只會導致從超類繼承注釋; 已實現接口上的注釋無效。

只要您注釋您的實現類,它就會起作用。

您的repositoryExec切入點應以+結尾,以建議Repository所有子類

  @Pointcut("this(org.springframework.data.repository.Repository+)")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM