如何在spring AOP中排除切入点表达式中的子包

i7uq4tfw  于 2022-12-21  发布在  Spring
关注(0)|答案(1)|浏览(169)

我已经搜索了它,但没有得到我所需的答案,包括扫描基本包和排除子包。
例如:项目结构

MyTest
--src/main/java
----com.spring
----com.spring.controller
----com.spring.entity
----com.spring.repository
----com.spring.service
----com.spring.service.dto
----com.spring.repo.dto
----com.spring.repo.dto.v2
----com.spring.service.dto.v2
----com.spring.service.pojo

我想写一个切入点,在这里我将扫描基本包com.spring,并希望排除dto子包。
下面是我的尝试:

basePkg="com.spring";
"execution(* " + basePkg + ".service.*.*(..))" +  " && !execution(* *.dto.*(..))" ;

这不包括dto,但仅包括扫描服务包。注意:我不想包括所有需要的pkg手动,因为可能有(实际上是)在项目中的pkg数量。

"execution(* " + basePkg + "..*.*(..))" +  " && !execution(* *.dto.*(..))" ;
   "execution(* " + basePkg + "..*.*(..))" +  " && !execution(* " + basePkg + "..*.dto.*.*(..))"

上面我扫描了所有包,并试图排除dto子包...但它扫描所有包没有dto排除。
我需要一些指导。
编辑:
一般来说,Spring应用程序有一个基础包,并在相应的子包中添加业务。这里我给出了com.spring。因此,我需要在其所有子包中建议所有方法,如果我想排除任何子包(com. spring. dto/com. spring. service. dto/com. spring. service. dto. v2/com. spring. repo. dto/com. spring. repo. dto. v2等),我应该能够排除这些,因为其所有子包都有共同的dto子包。
请参考我的项目包。我需要一个通用的添加或删除不是个别子到子包

8yparm6h

8yparm6h1#

您的项目结构

com.spring
 |- service
 |   |- Service.java
 |
 |- dto
 |   |- Dto.java

这就是从poincut中排除dto的方法

@Pointcut("within(com.spring.service..*) && !within(com.spring.service.dto..*)")
public void serviceMethodPointcut() {}

对于上述问题中的项目结构

MyTest
--src/main/java
----com.spring
----com.spring.controller
----com.spring.entity
----com.spring.repository
----com.spring.service
----com.spring.service.dto
----com.spring.repo.dto
----com.spring.repo.dto.v2
----com.spring.service.dto.v2
----com.spring.service.pojo

这个切入点会有用的-

execution(* com.spring..*(..)) && within(com.spring..*) &&  !within(*..dto..*);

within(com.spring..*) && !within(*..dto..*)

与一样,上面的切入点匹配com.spring包及其子包中的任何方法,除了包名称中有dto的方法。
方法的示例与切入点匹配

com.spring.service.myservice.methodB()
com.spring.pojo.mypojo.methodA()

该方法的示例不会与切入点匹配

com.spring.service.dto.mydto.methodA()
com.spring.repo.dto.v2.methodA()

相关问题