启用Spring AOP或AspectJ

11

以下是对这个问题的跟进:

Spring autowired bean for @Aspect aspect is null

我最初的理解是,在使用Spring AOP时,用@Aspect注释的类会被创建为Spring管理的bean,所以依赖注入会像正常情况下一样工作。然而,似乎使用@Aspect注解的对象会在spring容器之外创建为单例,因此我需要像以下方式在XML中进行配置,才能使其成为Spring管理的bean:

<bean id="aspect" class="com.mysite.aspect" factory-method="aspectOf" />

这现在完全把我搞糊涂了。我原本认为以下配置会使用Spring AOP:

<context:component-scan base-package="com.mysite.aspectPackage"/>
<aop:aspectj-autoproxy/>
因此,使用 component-scan 扫描 @Aspect 注解创建切面并创建切面 bean,然后 autoproxy 会创建一个 beanPostProcessor ,用适当的建议代理上下文中的所有 bean。 我之后认为需要启用 aspectJ ,我需要完全不同的 XML 配置(顺便说一句,在文档中我似乎找不到示例)。 此配置将使用 aspectJ 创建切面,这些切面将位于容器外部或通过操作字节码而不是代理实现。
注意:这不是关于 Spring AOP 和 AspectJ 之间差异的问题,这在这里已经有很好的阐述了:Spring AOP vs AspectJ
2个回答

22

@Aspect不是一个Spring注解,也不会被component-scan检测到。因此你需要以某种方式将它注册为Spring bean。使用aspectOf解决方案可以起作用。你也可以尝试其他方法。

@Aspect
@Component

那么,AspectJ配置和Spring AOP配置有什么区别呢? - mogronalol
1
这个能用吗?我发现如果这样做,Spring会创建两个类的实例,而作为方面的那个类没有注入其依赖项。 - Michael Wiles

7

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

使用@Configurable允许Spring在由aspectj容器实例化时管理依赖注入等类的操作。

@Aspect是一种aspectj风格的注释,由spring-aop支持,在运行时织入用于处理拦截等操作。

编译时织入允许您忽略使用,因为切入点将存在于字节码中,这是通过aspectj编译器完成的(有关mvn集成,请参见https://www.mojohaus.org/aspectj-maven-plugin/)。

无论您使用aspectj编译器还是spring-aop,都不会产生您想要的方式将您的方面作为托管bean创建,除非您使用工厂/configurable。

Aspectj配置严格来说是存在于您的类内部的切入点定义等内容。


2
我尝试了在Spring 4.3中使用@Aspect@Component注释方面,即使是带有DI的情况下也完美地工作,就像@Bozho在他的答案中所写的那样。 - csharpfolk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接