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");
}
}
试试这个:
将@EnableAspectJAutoProxy
替换为@EnableAspectJAutoProxy(proxyTargetClass = false)
将切入点更改为
@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 管理
我正在尝试创建一个演示 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");
}
}
试试这个:
将
@EnableAspectJAutoProxy
替换为@EnableAspectJAutoProxy(proxyTargetClass = false)
将切入点更改为
@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 管理