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