Spring AOP原理

Spring AOP 原理

aop:面向切面(方面)编程,

扩展功能不修改源代码实现

AOP 机制

采用横向抽取机制,取代原来的纵向抽取机制

纵向抽取机制
纵向抽取机制

* 横向抽取机制*
横向抽取机制

aop底层使用动态代理实现

(1)第一种情况,有接口情况,使用动态代理创建接口实现类代理对象 (jdk动态代理)
(2)第二种情况,没有接口情况,使用动态代理创建类的子类代理对象 (cglib 动态代理)

AOP 常见术语

  • 连接点 : 类中的哪些方法可被增强,这些方法称之为连接点
  • 切入点: 类中很多方法可以被增强,实际增强的方法称之为切入点
  • 通知: 增强的逻辑,比如扩展的日志功能,事务等功能
    前置通知 before:方法执行之前执行
    后置通知 after:方法执行之后执行,不论方法是否执行成功
    环绕通知 around :方法执行之前和之后执行,相当于将切点的执行放入到这个环绕通知中,由其决定是否执行以及执行前后的操作

    另外常见一个新的类进行执行
    // 执行之前的操作
    jointpoint.proceed();
    // 执行之后的操作

    异常通知 after-throwing:方法抛出异常之后执行
    最终通知 after-returning:方法执行成功之后调用通知
  • 切面:把增强(通知)应用到具体的方法上面的过程称为切面
  • 织入:把切面应用到目标对象来创建新的代理对象的过程
  • 引入: 允许我们 向现有的类添加新的属性或者方法

AspectJ 进行AOP的配置

基于aspectj的xml 配置

1 切入点:实际增强的方法

2 常用的表达式
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
(1)切入点为 book类中的 add 方法—–execution(* cn.itcast.aop.Book.add(..))
(2)切入点为book类中的所有方法—–execution(* cn.itcast.aop.Book.*(..))
(3)切入点为所有的方法——-execution(* .(..))
(4)切入点为匹配所有save开头的方法 execution(* save*(..))

<!-- 1  配置对象 -->
<bean id="book" class="cn.itcast.aop.Book"></bean>
<bean id="myBook" class="cn.itcast.aop.MyBook"></bean>

<!-- 2 配置aop操作 -->
<aop:config>
  <!-- 2.1 配置切入点 -->
  <aop:pointcut expression="execution(* cn.itcast.aop.Book.*(..))" id="pointcut1"/>

  <!-- 2.2 配置切面
    把增强用到方法上面,ref为实际增强方法所在的类
  -->
  <aop:aspect ref="myBook">
    <!-- 配置增强类型
      method: 增强类里面使用哪个方法作为前置
    -->
    <aop:before method="before1" pointcut-ref="pointcut1"/>

    <aop:after-returning method="after1" pointcut-ref="pointcut1"/>

    <aop:around method="around1" pointcut-ref="pointcut1"/>
  </aop:aspect>
</aop:config>

基于AspectJ的注解配置


说明: 本文大部分内容都是跟随者传播智课的教学视频学习而来,可以看做是翻译文章,只是自己吸收之后又书写一遍,加深自己的知识理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章