【Spring学习笔记】AOP

来源:互联网 发布:redis存储数据大小 编辑:程序博客网 时间:2024/05/01 18:54

1. 背景

这次笔记的内容主要记录Spring AOP的基础知识,在最近的开发工作中出现好几次数据没有被存到数据库的状况,自己debug了好久也没有发现在逻辑上出现了什么问题.

倒腾了很久,才发现自己写的service方法的名称没有符合项目中的规范命名,自己就看了看项目是如何实现这样的机制,下面是项目中简化配置示例:

<tx:advice id="dao.txAdvice" transaction-manager="transactionManager">        <tx:attributes>            <tx:method name="insert*" isolation="REPEATABLE_READ" />            <tx:method name="save*" isolation="REPEATABLE_READ" />            <tx:method name="update*" isolation="REPEATABLE_READ" />            <tx:method name="del*" isolation="REPEATABLE_READ" />            <tx:method name="do*" isolation="REPEATABLE_READ" />            <tx:method name="*" isolation="REPEATABLE_READ" read-only="true" />        </tx:attributes></tx:advice><aop:config proxy-target-class="true">    <aop:advisor pointcut="execution(* com.xxxx..*.service..*.*(..))" advice-ref="dao.txAdvice" order="200" /></aop:config>

2. 理解

xml配置中的前半部分是描述哪些方法上将会使用事务,通过配置可以简单的了解到,方法名以”insert”, “save”, “update”, “del”或”do”等开头的都将使用数据库事务来管理,以保证数据的一致性,而对于其他的命名的方法,则只具有`read-only=true’权限,即只有读取的权限,各种对数据库数据修改操作都将不生效,这下我可找到原因了.同时也说明了写程序时,方法名不要随便乱取,按照统一的规范命名,因为规范的命名可能对应这相关的处理细节.

<aop:config> </aop:config>这个xml元素是用来配置Spring AOP, AOP的中文名称是面向切面编程,在当前项目的配置中可以看到对事务的处理深度是在service包下的类,所以

Spring AOP可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。
这里写图片描述

这样做的好处是业务组件只需要关心自己应该处理的业务逻辑,而不需要把这些与业务逻辑不相关的代码耦合在一起.

3. AOP相关术语

下图是AOP中相关元素之间的关系图

这里写图片描述

1) Aspect :切面,切入系统的一个切面。比如事务管理是一个切面,权限管理也是一个切面;

2) Join point :连接点,也就是可以进行横向切入的位置;

3) Advice :通知,切面在某个连接点执行的操作(分为: Before advice , After returning advice , After throwing advice , After (finally) advice , Around advice );

4) Pointcut :切点,符合切点表达式的连接点,也就是真正被切入的地方;

4. AOP 的实现原理

AOP分为静态AOP和动态AOP。

  1. 静态AOP是指AspectJ实现的AOP,他是将切面代码直接编译到Java类文件中。动态AOP是指将切面代码进行动态织入实现的AOP。

  2. Spring的AOP为动态AOP,实现的技术为: JDK提供的动态代理技术 和 CGLIB(动态字节码增强技术) 。尽管实现技术不一样,但 都是基于代理模式 , 都是生成一个代理对象 。

这里写图ss片描述

参考:
1. Spring AOP 深入剖析
2. Spring In Action

0 0
原创粉丝点击