使用Aspectj指向扩展类方法



我在pom.xml 中添加了以下依赖项

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>

我有一个扩展抽象控制器的控制器

// actual controller
@RestController
@RequestMapping("/testContoller/v1")
class TestController: AbstractTestController()

// abstract class
abstract class AbstractTestController {
@GetMapping("/test")
fun testFunction():String {
return "hello"
} 
}

方面类

@Aspect
@Configuration
class TestAspect {
@Around(
"execution(* com.test.project.controllers.TestController.*(..) )"
)
fun testIntercept(joinPoint: ProceedingJoinPoint): Any? {
return joinPoint.proceed()
}
}

现在,我想通过TestControllerAbstractTestContoller上的所有方法执行创建一个切入点。我该怎么做?

我试过:

"execution(* com.test.project.controllers.TestController.*(..) )"
"execution(* com.test.project.controllers.TestController+.*(..) )"
"execution(* com.test.project.controllers.AbstractTestController.*(..) )"
"execution(* com.test.project.controllers.AbstractTestController+.*(..) )"

"within(com.test.project.controllers.TestController)"
"within(com.test.project.controllers.TestController+)"
"within(com.test.project.controllers.AbstractTestController)"
"within(com.test.project.controllers.AbstractTestController+)"

这些都不起作用

AspectJ

如果您不同时执行以下操作之一,则将AspectJ weaver添加到Maven项目中不会产生任何效果:

  • 添加AspectJ Maven插件,以便使AspectJ编译器将您的方面编织到目标类中,或者
  • 使用类似-javaagent:/my/path/aspectjweaver.jar的AspectJ编织代理运行Java

Spring AOP

第二种可能性:您并没有像您可能认为的那样真正使用AspectJ,而是简单地使用了一个名为Spring AOP的"AOP lite"框架,该框架以完全不同的方式进行配置。因此,除非你在更新的问题或GitHub项目中提供完整的MCVE,否则没有人能够告诉你到底做错了什么。

无论您使用AspectJ还是SpringAOP,在这两种情况下,我都建议您先阅读一些文档。

更新:Spring AOP的@Aspect应该是@Component,而不是@Configuration。请将后者放在一个单独的类中,并在那里配置一些东西。

最新更新