美文网首页人生几何?
面向切面程序设计分析:Spring AOP框架中代理的选择和使用

面向切面程序设计分析:Spring AOP框架中代理的选择和使用

作者: 攻城狮Chova | 来源:发表于2021-08-31 23:22 被阅读0次
    • AOP类型的选择:
      • AspectJ框架
      • Spring AOP框架
        • 两种AOP类型分为基于XML配置文件的风格和基于 @AspectJ注解的风格
      • AspectJ和Spring AOP比较:
        • AspectJ:
          • AspectJ在功能完善度方法更具有优势
          • AspectJ使用静态织入的方式实现AOP
          • 依赖于特定的编译器ajc
        • Spring AOP:
          • Spring AOP中并没有提供完整的AOP功能,更加注重的是和IOC容器的结合来解决横切业务问题
          • Spring AOP使用动态代理构建内部机制的动态织入的方式实现AOP
          • Spring AOP只是使用了和AspectJ相同的注解,但是底层是通过动态代理技术实现AOP
          • 不依赖于AspectJ特定的编译器ajc
      • 基于XML配置文件的风格个基于@AspectJ注解的风格比较:
        • 基于XML配置文件的风格:
          • aop:config
            • proxy-target-class : 是否作为代理的目标类,默认为false
            • expose-proxy : 是否暴露代理的Bean. 如果暴露,就可以通过Spring AopContext获取到代理的Bean. 默认为不暴露
          • aop:pointcut
            • pointcut的解析是生成一个BeanDefinition, 并将配置的id,expression等属性保存到BeanDefinition
            • BeanDefinitionID来自配置的id属性,如果没有配置就自动生成ID
            • BeanDefinitionclass就是AspectJExpressionPointcut
            • BeanDefinitionscopeprototype
          • aop:advisor
            • advice-ref : 必须的属性.这里的advice必须实现org.aopalliance.aopAdvice的子接口
            • pointcut-ref : 构建一个RuntimeBeanReference对象指向员pointcut的引用
          • aop:aspect
            • ref: 必须的属性. 用来指定AOP中的标签是哪一个bean, 类和对象的方法
          • aop:declare-parents
          • 优点:
            • 基于XML配置文件由POJO支持,可以从配置文件中清楚地看出系统存在哪些方面Aspect
          • 缺点:
            • 基于XML配置文件没有完全封装在一个地方,需求点Joinpoint分为支持Bean类的声明和配置文件中的XML
            • 基于XML配置文件只支持单例的实例化切入点Pointcut模型,不能组合XML中声明命名的切入点
        • 基于@AspectJ注解的风格:
          • 基于 @AspectJ的注解支持额外的实例化模型和丰富的切入点组合
          • 基于 @AspectJ的注解可以将所有信息封装在一个模块Aspect中,将Aspect保持为模块化单元的优点
          • 基于 @AspectJ的注解可以很方便地迁移到AspectJ框架中
    • Spring AOP中代理的选择:
      • Spring AOP中的代理机制没有默认使用的代理 : (SpringBoot中默认开启了proxyTargetClass,默认都是使用CGLIB代理)
        • 如果代理的是实现接口的类,则使用JDK动态代理. 只要代理的类实现了至少一个接口,那么目标类型实现的接口都将会使用JDK动态代理
        • 如果代理的是子类,没有实现任何接口,则使用CGLIB代理
          • 也可以对实现接口的类强制使用CGLIB代理,需要满足以下条件:
            • 不能对final修饰的方法添加通知Advice, 因为final修饰的方法无法被覆盖
              • CGLIB代理中为了获取对目标类的引用,代理类必须要继承目标类,并且代理类会覆写所有publicprotected方法,在内部将调用委托给目标类
            • Spring 3.2之后不需要将CGLIB添加到项目类路径中,因为CGLIB已经包含在jarspring-core
            • Spring 4.0之后,因为CGLIB代理实例通过Objenesis创建,所以代理对象的构造函数不会被调用两次 ,CGLIB代理类不会初始化构造代理类自身继承的任何成员变量.想要访问只能通过gettersetter方法. 只有当JVM不允许时,才会有SpringAOP支持的双重调用
          • 使用CGLIB代理时,需要将 <aop:config />proxy-target-class属性设置为true
          • 如果使用 @AspectJ自动代理时需要强制使用CGLIB, 需要将 <aop:aspectj-autoproxy />proxy-target-class属性设置为true

    相关文章

      网友评论

        本文标题:面向切面程序设计分析:Spring AOP框架中代理的选择和使用

        本文链接:https://www.haomeiwen.com/subject/yxbtwltx.html