启用S​​pring AOP或AspectJ

这是从这个问题继续:

@Aspect方面的Spring autowired bean为null

我最初的理解是,当使用Spring AOP时,使用@Aspect注释的类被创建为spring managed beans,因此dependency injection将正常工作。 但是,似乎带有@Aspect注释的对象被创建为弹簧容器外的单例,因此我必须像XML一样配置它,以便将其作为spring托管bean启用:

 

这已经让我完全糊涂了。 我认为以下配置将使用spring AOP:

   

因此,它将使用组件扫描创建方面bean来扫描@Aspect注释,然后autoproxy将创建一个beanPostProcessor,它使用适当的建议代理我的上下文中的所有bean。 然后我想要启用aspectJ我需要一个完全不同的XML配置(顺便说一下,我似乎无法在文档中找到一个例子)。 正是这种配置使用aspectJ来创建将在我的容器之外的方面,或者通过操纵字节码而不是代理来工作。

注意
这不是关于spring AOP和J方面之间差异的问题,这里有很好的阐述:

Spring AOP vs AspectJ

@Component将创建2个实例,一个在Spring容器内,一个在aspectJ容器内。

使用@Configurable允许spring在由aspectj容器实例化时为您的类管理dependency injection等。

@Aspect是一个由spring-aop支持的aspectj样式注释,其中运行时编织用于处理拦截等。

编译时编织允许您忽略字节码中将出现的切入点的使用,这是通过aspectj编译器完成的(请参阅http://mojo.codehaus.org/aspectj-maven-plugin/进行mvn集成)。

无论您使用aspectj编译器还是spring-aop都没有区别,除非您使用工厂/可配置,否则它不会以您希望的方式创建您的方面作为托管bean。

严格意义上,Aspectj配置是在您的类中存在的切入点定义等。

@Aspect不是弹簧注释,并且组件扫描不会检测到它。 所以你必须以某种方式将它注册为一个spring bean。 aspectOf解决方案有效。 你也可以试试

 @Aspect @Component 

使用

  • @Aspect
  • @Configurable

还要在XML配置文件中添加“”。