[英]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.