使用注释时未调用@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
第二行是您想要打印的内容。
我创建了一个注释来进行如下操作:
@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
第二行是您想要打印的内容。