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的注解配置

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值