AOP全名为Aspect-Oriented Programming,意思是面向横切面编程,前边咱们有过介绍 面向横切面编程AOP的理解 ,咱们经过这种编程思想很容易的扩展咱们的应用程序。html
一,如何实现AOP编程思想呢?实现这种编程思想的一个重要手段就是代理模式或者说模仿代理模式的运用。尤为是其中动态代理模式,JDK提供的Proxy的使用,这个在前边也总结:Proxy代理模式的应用 而这种动态代理是基于接口的,也就是说代理对象和目标对象实现了同一个接口。而假如咱们应用中没有使用接口,就没法使用Proxy了。可是不要着急,CGLIB这个组件解决了这个问题,它正是弥补jdk中的不足,专门基于继承来实现动态代理,其中代理对象是继承目标对象进行扩展的。它和JDK提供的Proxy实现原理是很是相似的。这里看一下网上的资料吧:java动态代理(JDK和cglib)java
二,事务(Trasaction)node
这个在数据库中咱们学习过,为何在这里又提出来呢?由于Spring框架运用在咱们的service层。而事务的应用正是用到一个业务当中,也就是咱们的Service层,因此声明式事务在Spring框架中的应用,也是其实现AOP编程思想很是出色的地方。下边先看一下事务的基础知识。spring
1,事务的四大特性:数据库
原子性:指的是数据库事务是一个不可分割的工做单元express
一致性:指的是数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。编程
隔离性:并发环境中,当不一样的事务同时操做相同的数据时,每一个事务都有各自的完整数据空间。并发
持久性:只有事务提交,数据就所作的更新操做必须永久保存下来。app
2,多个事务嵌套时,几种设置方法:框架
方式 |
说明 |
REQUIRED: |
业务方法须要在一个事务中运行,若是方法运行时,已经存在一个事务中,那么加入到该事务,不然本身建立一个新事务。 |
SUPPORTS: |
若是存在一个事务,那么使用当前事务,若是没有事务,则不使用事务。 |
MANDATORY: |
若是有一个事务,则使用事务,若是没有可使用的事务,则发生异常。 |
REQUIRESNEW: |
无论是否存在事务,业务方法总为本身发起一个新事务;若是方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被建立,直到方法调用结束,新事务才结束,原先的事务再恢复执行。 |
NOT_SUPPORTED: |
声明方法不须要事务,若是方法没有关联到事务,容器不会为它开启事务,若是方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。 |
NEVER: |
业务方法绝对不能再事务范围内执行,若是方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,方法才可以正常执行。 |
NESTED: |
若是一个活动的事务存在,则运行在一个嵌套的事务中,若是没有活动事务,则按照REQUIRED属性执行,它使用了一个单独的事务,这个事务有多个能够回滚的保存点,内部事务的回滚不会对外部事务产生影响。它只对DataSourceTransactionManager事务管理器有效。 |
3,事务的隔离级别:
级别 |
说明 |
ISOLATION_DEFAULT |
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应 |
ISOLATION_READ_UNCOMMITTED |
这是事务最低的隔离级别,它充许别外一个事务能够看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读 |
ISOLATION_READ_COMMITTED(Oracle默认隔离级别) |
保证一个事务修改的数据提交后才能被另一个事务读取。另一个事务不能读取该事务未提交的数据。这种事务隔离级别能够避免脏读出现,可是可能会出现不可重复读和幻像读。 |
ISOLATION_REPEATABLE_READ(MySQL默认隔离级别) |
这种事务隔离级别能够防止脏读,不可重复读。可是可能出现幻像读。它除了保证一个事务不能读取另外一个事务未提交的数据外,还保证了避免下面的状况产生(不可重复读)。 (行级锁 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,在核心配置文件中配置目标对象和代理对象,还有就是二者之间的关系,例如:
分析总结:这里须要注意组合关系的编写,例如匹配此事务的目标方法execution如何匹配,事务的隔离级别如何定义等。还须要注意的是,这里写了rollback-for="java.lang.Exception",由于Spring框架默认的是针对运行时异常进行回滚的,而对编译时异常不会回滚,因此在这里要进行声明。更多关于组合对象之间的关系,能够查看官网上的帮助文档,上边列举的例子较多。
综上为Spring框架中的关于AOP的相关知识,须要咱们在实践中不断使用。固然了,Spring框架和其它框架集成起来了,才会更强大的。后边看框架的组合使用……