AOP全名为Aspect-Oriented Programming,意思是面向横切面编程,前边我们有过介绍   面向横切面编程AOP的理解 ,我们通过这种编程思想很容易的扩展我们的应用程序。

一,如何实现AOP编程思想呢?实现这种编程思想的一个重要手段就是代理模式或者说模仿代理模式的运用。尤其是其中动态代理模式,JDK提供的Proxy的使用,这个在前边也总结:Proxy代理模式的应用                       而这种动态代理是基于接口的,也就是说代理对象和目标对象实现了同一个接口。而假如我们应用中没有使用接口,就无法使用Proxy了。但是不要着急,CGLIB这个组件解决了这个问题,它正是弥补jdk中的不足,专门基于继承来实现动态代理,其中代理对象是继承目标对象进行扩展的。它和JDK提供的Proxy实现原理是非常类似的。这里看一下网上的资料吧:java动态代理(JDK和cglib)

二,事务(Trasaction)

这个在数据库中我们学习过,为什么在这里又提出来呢?因为Spring框架运用在我们的service层。而事务的应用正是用到一个业务当中,也就是我们的Service层,所以声明式事务在Spring框架中的应用,也是其实现AOP编程思想非常出色的地方。下边先看一下事务的基础知识。

1,事务的四大特性:

原子性:指的是数据库事务是一个不可分割的工作单元

一致性:指的是数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

隔离性:并发环境中,当不同的事务同时操作相同的数据时,每个事务都有各自的完整数据空间。

持久性:只有事务提交,数据就所做的更新操作必须永久保存下来。

2,多个事务嵌套时,几种设置方法:

方式

说明

REQUIRED:

业务方法需要在一个事务中运行,如果方法运行时,已经存在一个事务中,那么加入到该事务,否则自己创建一个新事务。

SUPPORTS:

如果存在一个事务,那么使用当前事务,如果没有事务,则不使用事务。

MANDATORY

如果有一个事务,则使用事务,如果没有可以使用的事务,则发生异常。

REQUIRESNEW:

不管是否存在事务,业务方法总为自己发起一个新事务;如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法调用结束,新事务才结束,原先的事务再恢复执行。

NOT_SUPPORTED:

声明方法不需要事务,如果方法没有关联到事务,容器不会为它开启事务,如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。

NEVER:

业务方法绝对不能再事务范围内执行,如果方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,方法才能够正常执行。

NESTED:

如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按照REQUIRED属性执行,它使用了一个单独的事务,这个事务有多个可以回滚的保存点,内部事务的回滚不会对外部事务产生影响。它只对DataSourceTransactionManager事务管理器有效。

3,事务的隔离级别:

级别

说明

ISOLATION_DEFAULT

这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应

ISOLATION_READ_UNCOMMITTED

这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读

ISOLATION_READ_COMMITTEDOracle默认隔离级别

保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

ISOLATION_REPEATABLE_READMySQL默认隔离级别)

这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

(行级锁  select。。。for update)

ISOLATION_SERIALIZABLE

这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

三,声明式事务的使用:

Spring默认情况下是不支持AOP功能的,如果使用需要引入AspectJ jar包。AspectJ是专门来做AOP操作的框架,Spring可以利用AspectJ进行AOP编程。看一下步骤吧!

1,拷贝相应的jar包:

commons-logging.jar

spring.jar(Spring核心jar包,支持IoC的jar包)

SPRING_HOME\lib\aspectj\aspectjrt.jar

SPRING_HOME\lib\aspectj\aspectjweaver.jar(支持AOP的jar包)

SPRING_HOME\lib\cglib\cglib-nodep-2.1_3.jar(支持继承动态的jar包)

2,拷入的核心配置文件applicationContext.xml需要加入增加命名空间和约束文件:

<beans...

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="

...

http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

3,核心配置文件中启用AOP功能:

<aop:aspectj-autoproxy/>

4, 定义目标类:

目标类可以有接口,如果有接口Spring使用jdk动态代理产生代理对象,完成功能扩展。也可以没有接口,如果没有接口,Spring使用cglib代理产生代理对象,完成功能扩展。

5,定义扩展对象,只是普通的javabean类,里边定义我们扩展的方法即可!

6,在核心配置文件中配置目标对象和代理对象,还有就是两者之间的关系,例如:

  1. <!-- 声明目标类对象 -->
  2. <bean id="targetDao" class="com.ljh.spring.aop.TargetDao"></bean>
  3. <!-- 声明扩展类对象,计算方法的执行时间 -->
  4. <bean id="timePrint" class="com.ljh.spring.aop.TimePrint"></bean>
  5. <!-- 组合目标对象和扩展对象的关系 -->
  6. <aop:config>
  7. <aop:aspect id="timeAspect" ref="timePrint">
  8. <aop:pointcut expression="execution(public * * (..))" id="timePoincat"   isolation="DEFAULT" rollback-for="java.lang.Exception"/>
  9. <aop:before method="printStartTime" pointcut-ref="timePoincat"    isolation="DEFAULT"   rollback-for="java.lang.Exception"/>
  10. <aop:after method="printEndTime" pointcut-ref="timePoincat"   isolation="DEFAULT"  rollback-for="java.lang.Exception"/>
  11. </aop:aspect>
  12. </aop:config>

分析总结:这里需要注意组合关系的编写,例如匹配此事务的目标方法execution如何匹配,事务的隔离级别如何定义等。还需要注意的是,这里写了rollback-for="java.lang.Exception",因为Spring框架默认的是针对运行时异常进行回滚的,而对编译时异常不会回滚,所以在这里要进行声明。更多关于组合对象之间的关系,可以查看官网上的帮助文档,上边列举的例子较多。

综上为Spring框架中的关于AOP的相关知识,需要我们在实践中不断使用。当然了,Spring框架和其它框架集成起来了,才会更强大的。后边看框架的组合使用……

Spring(三)——AOP的更多相关文章

  1. Spring(三)AOP面向切面编程

    原文链接:http://www.orlion.ga/205/ 一.AOP简介 1.AOP概念 参考文章:http://www.orlion.ml/57 2.AOP的产生 对于如下方法:     pub ...

  2. 10 Spring框架 AOP (三) Spring对AspectJ的整合

    上两节我们讲了Spring对AOP的实现,但是在我们的开发中我们不太使用Spring自身的对AOP的实现,而是使用AspectJ,AspectJ是一个面向切面的框架,它扩展了Java语言.Aspect ...

  3. 死磕Spring之AOP篇 - Spring AOP自动代理(三)创建代理对象

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  4. 三、spring的AOP

    AOP的基本认识 Aspect Oriented Programming,面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 利用AOP可以对业务逻辑的各个部分进行隔离,从而 ...

  5. spring学习三:Spring的Aop、代理

    ref:https://mp.weixin.qq.com/s/J77asUvw8FcnF-6YlX6AAw AOP相关术语:    Joinpoint(连接点):类里面可以被增强的方法,这些方法称为连 ...

  6. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  7. spring的AOP

    最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spr ...

  8. Spring(五)AOP简述

    一.AOP简述 AOP全称是:aspect-oriented programming,它是面向切面编号的思想核心, AOP和OOP既面向对象的编程语言,不相冲突,它们是两个相辅相成的设计模式型 AOP ...

  9. Spring之AOP面向切片

       一.理论基础: AOP(Aspectoriented programming)面向切片/服务的编程,在Spring中使用最多的是对事物的处理.而AOP这种思想在程序中很多地方可以使用的,比如说, ...

随机推荐

  1. 【转】TI-Davinci开发系列之六CCS5.2调试Linux内核

    上转博文<TI-Davinci开发系列之五CCS5.2使用gdbserver远程调试应用程序> 使用CCS5.2远程调试内核时,只需导入Linux内核源码,而不需要编译内核,也就不会用到交 ...

  2. python list 按长度分段

    def changes(a,b): #list 分段函数,a:数据[(1),(2)]b:长度 for i in xrange(0,len(a),b): yield  a[i:i+b] for i in ...

  3. java并发编程--Executor框架(一)

    摘要:        Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程 ...

  4. K贪心

    <span style="color:#330099;">/* K - 贪心 基础 Time Limit:1000MS Memory Limit:32768KB 64b ...

  5. Hacker(12)----个人计算机安全防护策略

    了解了黑客的常用入侵方法,针对这些方法分别指定对应的防护策略不太现实,因此用户只能掌握个人计算机安全的常见防护策略,以确保计算机处在一个相对安全的环境中.常见个人计算机防护策略有:安装并及时升级杀毒软 ...

  6. TCP/IP系列——长连接与短连接的区别

    1 什么是长连接和短连接       三次握手和四次挥手   TCP区别于UDP最重要的特点是TCP必须建立在可靠的连接之上,连接的建立和释放就是握手和挥手的过程. 三次握手为连接的建立过程,握手失败 ...

  7. C#图像处理(1):在图片上加文字和改变文字的方向

    C#在图片上加文字,代码如下: /// <summary> /// 图片上方加文字,文字将会被180度反转 /// </summary> /// <param name= ...

  8. PHP学习笔记三十【final】

    <?php //final不能去修饰属性(变量) //如果希望类不希望被继承就可以使用final关键字 final class Person() { public function sayHi( ...

  9. 最强烈推荐-我的java收藏夹(内有国内最好的java论坛)

    原地址: http://bbs.chinaitlab.com/dispbbs.asp?boardid=148&id=34276 国内: www.chinajavaworld.com-论坛人很多 ...

  10. Unity-碰撞

    固定位置和角度 选择项目视图中的 Prefab. 打开检视面板中的 Rigidbody 标签可以看到 Constraints 项. 点击左边的三角形图标, 下面会进一步显示 Freeze Positi ...