首页 文章

启用Spring AOP或AspectJ

提问于
浏览
7

这是从这个问题继续:

Spring autowired bean for @Aspect aspect is null

我最初的理解是,当使用Spring AOP时,使用@Aspect注释的类被创建为spring managed beans,因此依赖注入将正常工作 . 但是,似乎带有@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/>

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

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

Spring AOP vs AspectJ

3 回答

  • 12

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

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

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

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

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

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

  • 4

    @Aspect 不是 spring 注释,并且组件扫描未检测到它 . 所以你必须以某种方式注册它作为一个 Spring 天 beans . aspectOf 解决方案有效 . 你也可以试试

    @Aspect
    @Component
    
  • -1

    使用

    • @Aspect

    • @Configurable

    还要在XML配置文件中添加“<context:spring-configured />” .

相关问题