我有 @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)
但是我需要这个注释才能将它应用于特定的存储库。
相关分类