spring 方面不会在应用程序中的存储库周围触发

68bkxrlz  于 2023-03-16  发布在  Spring
关注(0)|答案(1)|浏览(131)

我想为用存储库注解的类触发我的方面,这些类属于我的包,例如下面这个:

//com.foo.myapp.bar.repositories.dao
@Repository
public class MyRepo extends JpaRepository<MyEntity, String>{

我的类是jpa存储库,创建如下:

@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "firstManagerFactory",
    transactionManagerRef = "firstTransactionManager",
    basePackages = {"com.foo.myapp.bar.repositories.first.dao"}

)公共类DbConfig {
我的方面如下所示,但只有在离开repository()切入点时才会激活,但如果我还指定了应用程序包,它就不起作用了:

@Pointcut("within(@org.springframework.stereotype.Repository *)")
private void repositoryInvocation() {
    // Method is empty as this is just a Pointcut, the implementations are in the advices.
}

@Pointcut("within(com.foo.myapp..*)")
public void applicationPackage() {
    // Method is empty as this is just a Pointcut, the implementations are in the advices.
}

@Around("repositoryInvocation() && applicationPackage()") //this && doesn't work, I have to remove the second one
public Object aspectTriggers(ProceedingJoinPoint joinPoint) throws Throwable {
    Object result = joinPoint.proceed();
    return result;
}

我错过了什么?

编辑:

我想我明白了:问题是存储库的实现不属于我的应用程序包,而是属于spring的SimpleJPARepository,就好像方面只处理实现,完全忽略了接口。

pbpqsu0x

pbpqsu0x1#

我觉得你不想

@Pointcut("within(@org.springframework.stereotype.Repository *)")

而是

@Pointcut("@within(org.springframework.stereotype.Repository)")

注意你的切入点语法,这两个是不一样的

  • within()描述了一个包或类的名称,你想将切入点的范围/限制到它。
  • @within()查找具有给定注解的类型(类)。

你想要后者,而不是前者。

**编辑:**再想想,实际上我看不出第一个版本不应该工作的明显原因,尽管它比第二个版本复杂一点。

但是你说你在第二个切入点上遇到了问题。你100%确定你的仓库类真的在com.foo.myapp(子)包里吗?包名和切入点都没有打字错误吗?实际上,不用尝试,只要看一下,它应该可以工作。

相关问题