代理设计模式的原理:使用一个代理将本来对象包装起来,而后用该代理对象”取代”原始对象。任何对原始对象的调用都要经过代理。代理对象决定是否以及什么时候将方法调用转到原始对象上。spring
横切关注点:从每一个方法中抽取出来的同一类非核心业务。数据库
切面(Aspect):封装横切关注点信息的类,每一个关注点体现为一个通知方法。express
通知(Advice):切面必需要完成的各个具体工做编程
目标(Target):被通知的对象设计模式
代理(Proxy):向目标对象应用通知以后建立的代理对象服务器
链接点(Joinpoint):横切关注点在程序代码中的具体体现,对应程序执行的某个特定位置。例如:类某个方法调用前、调用后、方法捕获到异常后等。并发
切入点(pointcut):定位链接点的方式。每一个类的方法中都包含多个链接点,因此链接点是类中客观存在的事物。框架
AspectJ:Java社区里最完整最流行的AOP框架。在Spring2.0以上版本中,可使用基于AspectJ注解或基于XML配置的AOP。模块化
1.导入JAR包性能
2.引入aop名称空间
3.配置
<aop:aspectj-autoproxy>
当Spring IOC容器侦测到bean配置文件中的<aop:aspectj-autoproxy>元素时,会自动为 与AspectJ切面匹配的bean建立代理
切入点表达式的语法格式
execution([权限修饰符] [返回值类型] [简单类名/全类名] [方法名]([参数列表])) |
<!-- 【拦截全部public方法】 --> <aop:pointcut expression="execution(public * *(..))" id="pt"/> <!-- 【拦截全部save开头的方法 】 --> <aop:pointcut expression="execution(* save*(..))" id="pt"/> <!-- 【拦截指定类的指定方法, 拦截时候必定要定位到方法】 --> <aop:pointcut expression="execution(public * cn.itcast.g_pointcut.OrderDao.save(..))" id="pt"/> <!-- 【拦截指定类的全部方法】 --> <aop:pointcut expression="execution(* cn.itcast.g_pointcut.UserDao.*(..))" id="pt"/> <!-- 【拦截指定包,以及其自包下全部类的全部方法】 --> <aop:pointcut expression="execution(* cn..*.*(..))" id="pt"/> <!-- 【取非值】 --> <aop:pointcut expression="!execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>
切入点表达式应用到实际的切面类中
在JavaEE企业级开发的应用领域,为了保证数据的完整性和一致性,必须引入数据库事务的概念,因此事务管理是企业级应用程序开发中必不可少的技术。
事务就是一组因为逻辑上紧密关联而合并成一个总体(工做单元)的多个数据库操做,这些操做要么都执行,要么都不执行。
事务的四个关键属性(ACID):
①原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操做在逻辑上缺一不可。事务的原子性要求事务中的全部操做要么都执行,要么都不执行。
②一致性(consistency):“一致”指的是数据的一致,具体是指:全部数据都处于知足业务规则的一致性状态。一致性原则要求:一个事务中无论涉及到多少个操做,都必须保证事务执行以前数据是正确的,事务执行以后数据仍然是正确的。若是一个事务在执行的过程当中,其中某一个或某几个操做失败了,则必须将其余全部操做撤销,将数据恢复到事务执行以前的状态,这就是回滚。
③隔离性(isolation):在应用程序实际运行过程当中,事务每每是并发执行的,因此颇有可能有许多事务同时处理相同的数据,所以每一个事务都应该与其余事务隔离开来,防止数据损坏。隔离性原则要求多个事务在并发执行过程当中不会互相干扰。
④持久性(durability):持久性原则要求事务执行完成后,对数据的修改永久的保存下来,不会因各类系统错误或其余意外状况而受到影响。一般状况下,事务对数据的修改应该被写入到持久化存储器中。
当事务方法被另外一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在本身的事务中运行。
事务的传播行为能够由传播属性指定。Spring定义了7种类传播行为。
事务传播属性能够在@Transactional注解的propagation属性中定义。
假设如今有两个事务:Transaction01和Transaction02并发执行。
①Transaction01将某条记录的AGE值从20修改成30。
②Transaction02读取了Transaction01更新后的值:30。
③Transaction01回滚,AGE值恢复到了20。
④Transaction02读取到的30就是一个无效的值。
2.不可重复读
①Transaction01读取了AGE值为20。
②Transaction02将AGE值修改成30。
③Transaction01再次读取AGE值为30,和第一次读取不一致。
①Transaction01读取了STUDENT表中的一部分数据。
②Transaction02向STUDENT表中插入了新的行。
③Transaction01读取了STUDENT表时,多出了一些行。
数据库系统必须具备隔离并发运行各个事务的能力,使它们不会相互影响,避免各类并发问题。一个事务与其余事务隔离的程度称为隔离级别。SQL标准中规定了多种事务隔离级别,不一样隔离级别对应不一样的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。
1.读未提交:READ UNCOMMITTED
容许Transaction01读取Transaction02未提交的修改。
2.读已提交:READ COMMITTED
要求Transaction01只能读取Transaction02已提交的修改。
3.可重复读:REPEATABLE READ
确保Transaction01能够屡次从一个字段中读取到相同的值,即Transaction01执行期间禁止其它事务对这个字段进行更新。
4.串行化:SERIALIZABLE
确保Transaction01能够屡次从一个表中读取到相同的行,在Transaction01执行期间,禁止其它事务对这个表进行添加、更新、删除操做。能够避免任何并发问题,但性能十分低下。
5.各个隔离级别解决并发问题的能力见下表
|
脏读 |
不可重复读 |
幻读 |
READ UNCOMMITTED |
有 |
有 |
有 |
READ COMMITTED |
无 |
有 |
有 |
REPEATABLE READ |
无 |
无 |
有 |
SERIALIZABLE |
无 |
无 |
无 |
6.各类数据库产品对事务隔离级别的支持程度
|
Oracle |
MySQL |
READ UNCOMMITTED |
false |
true |
READ COMMITTED |
true(默认) |
true |
REPEATABLE READ |
false | true(默认) |
SERIALIZABLE |
true | true |
用@Transactional注解声明式地管理事务时能够在@Transactional的isolation属性中设置隔离级别
在Spring 2.x事务通知中,能够在<tx:method>元素中指定隔离级别