Java 关于Spring中AOP配置的一些疑问

Java 关于Spring中AOP配置的一些疑问,java,spring,spring-mvc,aop,spring-aop,Java,Spring,Spring Mvc,Aop,Spring Aop,我正在学习Spring核心认证,我对Spring如何处理AOP有疑问 阅读文档后,您似乎了解了Java中获取AOP的两种方法: 使用AspectJ将字节码修改用于方面编织提供了一种成熟的面向方面编程语言。(因此在我看来,AspectJ是一种不同的语言,可以与Java集成以提供AOP特性) Spring AOP:在Spring框架中使用,该框架使用动态代理进行方面编织,而不是字节码修改 因此,我的疑问主要有以下几点: 1) 阅读文档发现了以下方法,可以将AOP支持添加到我的Spring应用程序中:

我正在学习Spring核心认证,我对Spring如何处理AOP有疑问

阅读文档后,您似乎了解了Java中获取AOP的两种方法:

  • 使用AspectJ将字节码修改用于方面编织提供了一种成熟的面向方面编程语言。(因此在我看来,AspectJ是一种不同的语言,可以与Java集成以提供AOP特性)

  • Spring AOP:在Spring框架中使用,该框架使用动态代理进行方面编织,而不是字节码修改

  • 因此,我的疑问主要有以下几点:

    1) 阅读文档发现了以下方法,可以将AOP支持添加到我的Spring应用程序中:

    使用JAVA配置类:

    @Configuration
    @EnableAspectJAutoProxy
    @ComponentScan(basePackages=“com.example”)
    public class AspectConfig {
        ...
    }
    
    <beans>
        <aop:aspectj-autoproxy />
        <context:component-scan base-package=“com.example” />
    </beans>
    
    使用XML配置:

    @Configuration
    @EnableAspectJAutoProxy
    @ComponentScan(basePackages=“com.example”)
    public class AspectConfig {
        ...
    }
    
    <beans>
        <aop:aspectj-autoproxy />
        <context:component-scan base-package=“com.example” />
    </beans>
    

    
    
    为什么??如果Spring使用Spring AOP而不是AspectJ为什么在Spring中配置AOP时会引用AspectJ


    2) 在前面的示例中,我们展示了两种配置Spring的方法:通过Java配置类和通过XML配置。我知道存在第三种配置Spring应用程序的方法:使用注释。因此是否存在一种使用注释配置AOP的方法?

    不确定我是否完全理解您的问题,我想您会问这样的问题:“如果我使用Spring AOP,为什么我会看到对AspectJ的引用?”

    如果是这样的话,您应该知道Spring不是在与AspectJ竞争,而是在AOP中利用AspectJ


    请参阅Spring文档:

    不确定我是否完全理解您的问题,我想您是在问这样的问题:“如果我使用Spring AOP,为什么我会看到对AspectJ的引用?”

    如果是这样的话,您应该知道Spring不是在与AspectJ竞争,而是在AOP中利用AspectJ


    请参阅Spring文档:

    我认为这些Spring AOP设置的名称中引用了AspectJ,这确实是令人恼火的,而不是有用的。我能理解你为什么感到困惑。SpringAOP与AspectJ实际上是一个不同的概念。正如您所说:SpringAOP中的动态JDK或CGLIB代理与AspectJ中编译或加载期间的字节码插装相比。其他差异包括:

    • AspectJ编译时编织需要一个名为Ajc的特殊编译器。它基本上是一个EclipseJava编译器Ecj,由负责插装的aspect weaver增强。相反,SpringAOP在运行时创建动态代理
    • 在AspectJ中有两种语法变体:原生和基于注释。前者更优雅、更具表现力,是Java的超集,绝对需要编译Ajc。后者使用Java注释,可以使用Javac进行编译,但是需要Ajc(编译时)和编织代理aspectjweaver.jar(加载时)中包含的aspect weaver来“完成”它们并使它们在运行时可用。这两种变体都需要aspectjrt.jar(非常小,用于运行时的编译时编织特性)和aspectjweaver.jar(更大,用于加载时编织,同时包含运行时和编织器)中包含的AspectJ运行时
    • AspectJ适用于任何Java类,它不需要甚至不知道Spring框架。Spring AOP需要以Spring框架为基础,您只能用它来测量弹簧bean /组件,而不是春天不可知的POJOS。
    • AspectJ更高效,因为它避免了代理。但是SpringAOP无论如何都是Spring框架的可选部分,所以如果您使用Spring,并且Springbeans的方法执行拦截就是您所需要的,那么使用它是非常有意义的
    • Spring AOP使用AspectJ切入点语法的一个子集。也许这就是Spring AOP使用AspectJ引用的微妙原因,但我仍然认为,在命名方面,不更清楚地区分这两个概念是一个错误的决定。此外,公共poinctut语言子集是在一个名为aopalliance.JAR的小JAR中定义的,因为很久以前,一个所谓的“AOP联盟”已经定义了该语法。然而,目前占主导地位且功能最强大的AOP语言是AspectJ,因此实际上AspectJ(由Eclipse维护)是该领域的领导者,IMO
    • 当我说SpringAOP使用AspectJ语法的子集时,相反地,它意味着AspectJ提供了一个超集。有更多的切入点类型,如
      call()
      set()
      get()
      等,您可以通过建议或类型间定义截取接合点并将横切关注点应用于代码库
    我不明白你的问题。您的示例中的配置类使用注释,因此没有第三种方法。;-)但在春天有一种古老的、真正过时的AOP方法,叫做拦截器。它是早期AOP方法的遗留物,现在有点过时,尽管它仍然可用


    Spring AOP和AspectJ都可以通过Spring中的XML或注释进行配置。:-)

    我认为,这些Spring AOP设置的名称中引用了AspectJ,这确实是令人恼火而不是有益的。我能理解你为什么感到困惑。SpringAOP与AspectJ实际上是一个不同的概念。正如您所说:SpringAOP中的动态JDK或CGLIB代理与AspectJ中编译或加载期间的字节码插装相比。其他差异包括:

    • AspectJ编译时编织需要一个名为Ajc的特殊编译器。它基本上是一个EclipseJava编译器Ecj,由负责插装的aspect weaver增强。相反,SpringAOP在运行时创建动态代理
    • 在阿斯佩克