【问题标题】:Enable Spring AOP or AspectJ启用 Spring AOP 或 AspectJ
【发布时间】:2012-03-28 20:15:10
【问题描述】:

这是从这个问题开始的:

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/>

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

注意
这不是关于spring AOP 和aspect J 区别的问题,这里说得很清楚:

Spring AOP vs AspectJ

【问题讨论】:

    标签: java spring aop spring-aop


    【解决方案1】:

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

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

    @Aspect是spring-aop支持的aspectj风格注解,其中使用runtime weaving处理拦截等。

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

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

    严格来说,Aspectj 配置是类中的切入点定义等。

    【讨论】:

    • 我在 spring 4.3 上试过这个,用 @Aspect @Component 注释方面即使使用 DI 也能很好地工作,就像@Bozho 在他的回答中写的那样
    【解决方案2】:

    使用

    • @Aspect
    • @Configurable

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

    【讨论】:

      【解决方案3】:

      @Aspect不是spring注解,component-scan检测不到。因此,您必须以某种方式将其注册为 spring bean。 aspectOf 解决方案有效。你也可以试试

      @Aspect
      @Component
      

      【讨论】:

      • 那么aspectJ配置和spring AOP配置有什么区别呢?
      • 这行得通吗?我发现如果我在这个 spring 中创建类的两个实例,并且用作方面的一个实例没有注入其依赖项。
      猜你喜欢
      • 2015-12-17
      • 1970-01-01
      • 2010-12-09
      • 2012-07-25
      • 2012-03-11
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多