Spring AOP 建议的方法不起作用。我的配置似乎没问题

Spring AOP adviced methods do not work. My configuration seems ok

我正在尝试创建一个演示 AOP 应用程序,但它无法正常工作。 我通读了所有教程并让它与 @RestController 一起工作,但是当我用一个普通的 java spring 驱动的应用程序尝试它时,我就是无法让它工作。请检查我的文件并告诉我我的错误所在。

申请Class

@SpringBootApplication
@ComponentScan("com.xetra.experimental")
@EnableAspectJAutoProxy
public class AoptryoutnowebApplication {

  public static void main(String[] args) {
    SpringApplication.run(AoptryoutnowebApplication.class, args);
    DefaultClassToAspectImpl defaultClassToAspectImpl = new DefaultClassToAspectImpl();
    defaultClassToAspectImpl.doStuff();
  }
}

ClassToAspect 接口

public interface ClassToAspect {
  void doStuff();
}

ClassToAspect 实现

@Component
public class DefaultClassToAspectImpl implements ClassToAspect {
  @FooAnnotation
  public void doStuff(){
    System.out.println("DoStuff!");
  }
}

切入点注释

public @interface FooAnnotation {
}

看点Class

@Aspect
public class FooAspect {

  @Pointcut("@annotation(FooAnnotation)")
  public void methods(){
  }

  @Before("methods()")
  public void doAspect(){
    System.out.println("FooAspect before");
  }
}

试试这个:

  1. @EnableAspectJAutoProxy替换为@EnableAspectJAutoProxy(proxyTargetClass = false)

  2. 将切入点更改为 @Pointcut("execution (* your.package..*.*(..)) && @annotation(fooAnnotation))")

问题是您正在通过执行 new DefaultClassToAspectImpl() 使用非 Spring 托管实例。 Spring AOP 仅适用于 Spring 托管 bean,因为默认情况下 Spring AOP 是基于代理的。

因此,您应该从 ApplicationContext 获取实例,而不是 new DefaultClassToAspectImpl()。使用 Spring 时启动 SpringApplication.run call returns an ApplicationContext。在这里您可以使用getBean 方法之一来获取您想要的实例。

ApplicationContext ctx = SpringApplication.run(AoptryoutnowebApplication.class, args);
ClassToAspect bean = getBean(ClassToAspect.class);
bean.doStuff();

这样您就可以 Spring 管理