启用S​​pring AOP或AspectJ

mog*_*lol 10 java aop spring spring-aop

这是从这个问题继续:

@Aspect方面的Spring autowired bean为null

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

<bean id="aspect" class="com.mysite.aspect" factory-method="aspectOf" />
Run Code Online (Sandbox Code Playgroud)

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

<context:component-scan base-package="com.mysite.aspectPackage"/>
<aop:aspectj-autoproxy/>
Run Code Online (Sandbox Code Playgroud)

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

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

Spring AOP vs AspectJ

Boz*_*zho 16

@Aspect不是弹簧注释,并且组件扫描不会检测到它.所以你必须以某种方式注册它作为一个春天豆.该aspectOf解决方案的工作.你也可以试试

@Aspect
@Component
Run Code Online (Sandbox Code Playgroud)


Mik*_*tel 6

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

使用@Configurable允许spring在由aspectj容器实例化时为您的类管理依赖注入等.

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

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

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

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

  • 我用 spring 4.3 尝试了这个,并用 `@Aspect` 注释了切面,即使使用 DI,@Component` 也能完美地工作,就像@Bozho 在他的回答中所写的那样 (2认同)