使用注释时未调用@Aspect

@Aspect not called when using annotation

我创建了一个注释来进行如下操作:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface Verify {
}

和一个方面:

@Aspect
@Component
public class VerifyAspect {
    @Before("execution(public * *(.., @Verify (*), ..))")
    public void actionBefore(JoinPoint joinPoint) {
       System.out.println(joinPoint); // <<-------------- can't see this message
    }
}

和一个配置:

@Configuration
@EnableAspectJAutoProxy
public class VerifyConfig {
}

但是当我打电话时:

public void method(@Verify MyObject obj){
   // do something
}

根本没有调用看点。我的创作有什么错误吗?

来自spring docs : Spring AOP 目前仅支持方法执行连接点(建议在Spring beans 上执行方法) - 所以请确保您正在调用的方法

public void method(@Verify MyObject obj){
   // do something
}

在 Spring 个 Bean 之一中声明。

根据您分享的代码,我创建了一个简单的演示:

还要确保 aspectjweaver.jar 在您的依赖项中

pom.xml

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>

主要应用程序

@SpringBootApplication
public class AspecjStyleAopApplication {

    public static void main(String[] args) {
        SpringApplication.run(AspecjStyleAopApplication.class, args);
    }

}

配置

在这里,确保为 Spring 提供正确的基础包以扫描您的组件

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = "com.example")
public class AspectJConfig {
}

注释

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface Verify {
}

看点

@Aspect
@Component
public class VerifyAspect {

    @Before("execution(public * *(.., @Verify (*), ..))")
    public void actionBefore(JoinPoint joinPoint) {
        System.out.println("THIS SHOULD BE DISPLAYED");
        System.out.println(joinPoint); // <<-------------- can't see this message
    }
}

服务

@Service
public class SampleService {

    public void method(@Verify Object obj){
        System.out.println("Passed object: " + obj);
    }
}

RestController

@RestController
public class SampleRestController {

    private final SampleService sampleService;

    public SampleRestController(SampleService sampleService) {
        this.sampleService = sampleService;
    }

    @GetMapping("/sample")
    public String sampleRestMethod() {
        sampleService.method(5);
        return "It works";
    }
}

以及控制台的输出,当我调用 http://localhost:8080/sample 端点时:

THIS SHOULD BE DISPLAYED
execution(void com.example.aspecjstyleaop.SampleService.method(Object))
Passed object: 5

第二行是您想要打印的内容。