• Spring实战(九)AOP概念以及Spring AOP


      1、横切关注点(cross-cutting concern)

      软件开发中,散布于应用中多处的功能被称为横切关注点,如事务、日志、安全。

      横切关注点从概念上是与应用的业务逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑中),而把横切关注点和业务逻辑分离正是AOP要解决的问题。

      DI用于应用对象之间的解耦,AOP实现横切关注点与他们所影响的对象之间的解耦。

      2、重用通用功能,最常见的技术是继承和委托

      继承会导致脆弱的对象体系;委托可能需要对委托对象进行复杂的调用。

      所以用切面取而代之。

      3、AOP术语

      Aspect:切面——把横切关注点模块化为特殊的类,这些类称为切面。

      Advice:通知or增强——所要增强or增加的功能,模式有Before、After、After-returning,、After-throwing、Around

      Join Point:连接点——应用执行过程中,能够插入切面的所有“点”(时机)

      Pointcut:切点——实际运行中,选择插入切面的连接点,即定义了哪些点得到了增强。

      Introduction:引入——向现有的类添加新方法和属性。

      Weaving:织入——把切面应用到目标对象并创建新的代理对象的过程。(也可以为植入)

      4、在目标对象的生命周期中,有多个点可以进行织入:

    • 编译期——需要特殊的编译器,AspectJ的织入编译器是以这种方式织入切面。
    • 类加载期——切面在目标类加载到JVM时被织入,需要特殊的类加载器(ClassLoader),使目标类被导入应用之前增强该目标类的字节码。
    • 运行期——切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象,Spring AOP以这种方式织入切面!

      

      5、Spring中提供了4种类型的AOP支持

    • 基于代理的经典Spring AOP;
    • 纯POJO切面——XML配置
    • @AspectJ注解驱动的切面——无需XML配置
    • 注入式AspectJ切面

      前三种是Spring AOP实现的变体,Spring AOP构建在动态代理基础上,因此,Spring对AOP的支持局限于方法拦截。如果你的AOP需求超过了简单的方法调用,如构造器或者属性拦截,那么你需要考虑使用AspectJ来实现切面

      6、Spring创建的通知都是用标准的Java类编写的,定义通知应用的切点可以使用注解或在Spring配置文件中用XML编写。

      AspectJ则用特有的AOP语言,可以获得更强大和细粒度的控制。

      7、Spring在运行时通知/增强目标对象——动态代理

      Spring中的切面由包裹了目标对象的代理类实现。代理类拦截并处理方法的调用,执行额外的切面逻辑,然后再调用目标对象的方法。

      那代理对象是什么时候创建的呢?

      当应用需要被代理的bean时,Spring才创建代理对象。

      被代理的对象(目标对象)又是什么时候创建?

      如果使用AppplicationContext,AppplicationContext从BeanFactory中加载所有bean时,Spring创建被代理对象。

      8、Spring只支持方法级别的连接点。

      AOP中连接点的模型有多种,如字段和构造器接入点。

      由于Spring基于动态代理,所以只支持方法连接点,因此无法创建细粒度的通知。

      如果需要方法拦截之外的连接点拦截功能,需要利用AspectJ补充Spring AOP。

  • 相关阅读:
    夺命雷公狗---PDO NO:9 使用PDO准备语句并执行语句3
    夺命雷公狗---PDO NO:9 使用PDO准备语句并执行语句2
    [LeetCode] Lowest Common Ancestor of a Binary Search Tree
    二叉树
    LeetCode Palindrome LinkList
    LeetCode Same Tree
    LeetCode Merge Sorted List
    LeetCode Remove Duplicated from Sorted List
    LeetCode Climbing Stairs
    LeetCode Count And Say
  • 原文地址:https://www.cnblogs.com/bigbigbigo/p/8370130.html
Copyright © 2020-2023  润新知