CrudRepository 和 Annotation 上的 Spring + AspectJ

我有 @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)


但是我需要这个注释才能将它应用于特定的存储库。


梵蒂冈之花
浏览 149回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java