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. 【转】Android中自动连接到指定SSID的Wi-Fi

    最近在做一个项目,其中涉及到一块“自动连接已存在的wifi热点”的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏些许错误造成功能无法 ...

  2. sql执行顺序整理

    sql的执行顺序,是优化sql语句执行效率必须要掌握的.各个数据库可能有细小的差别,但大体顺序是相同的,这里只做大致说明. 一.总体执行顺序 在sql语句执行之前,还有SQL语句准备执行阶段,这里不做 ...

  3. Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...

  4. ios学习笔记-数据持久化

    沙盒 沙盒是一种数据安全策略,只允许自己的应用访问目录.可以使用NSHomeDirectory()获取. ios沙盒下有三个子目录: 1.Documents目录:用于存储比较大的文件活着需要频发女更新 ...

  5. IOS 中关于自定义Cell 上的按钮 开关等点击事件的实现方法(代理)

    1.在自定义的Cell .h文件中写出代理,写出代理方法. @protocol selectButtonDelegate <NSObject> -(void)selectModelID:( ...

  6. struts2中的国际化

    [java] view plaincopy 实现struts2中国际化其实非常简单 首先,struts2中的国际化是通过资源文件来配置的. 资源文件分为:action类级,package类级,还有we ...

  7. C++Primer笔记(1)

    1.初始化 在C++中,初始化与赋值操作是完全不同的两个操作.初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替. 初始化的方式有: ; } ...

  8. OS X EI Capitan 10.11.4中sudo无法起作用的解决方法

    mac升级到OSX EI Capitan 10.11.4后sudo命令无法起作用,执行任何操作总是显示Operation denied.这是因为在10.11.4中引入了Rootless机制,即就算是R ...

  9. Java中关于final关键字

    final关键字,大学时一直没有理解,伴随到工作,郁闷......也可能大学真的没认真去学习 首先,final给人一看英语单词 不就是最终的嘛,最终的什么的呢 ? 小张现在就带大家 学习下..... ...

  10. 【译】JavaScript 开发者年度调查报告

    截至目前有超过了 5000 人参与了(该次调查),准确的说是 5350 人.我迫不及待的想要和大家分享一下这次调查的细节.在分享之前我想要感谢参与调查的每一个人.这是 JavaScript 社区一个伟 ...