事物
数据库:commit 提交;rollback 撤销;
JDBC:stat.executeUpdate()默认自动commit提交;
try{
con.setAutoCommit(false)://关闭自动提交
stat.executaUpdate(sql1);
stat.executeUpdate(sql2);
conn.commit();//提交
}catch(){
con.rollback; //撤销
}
事物:将一组和sql有关的操作,封装成一个整体;
MyBatis:封装了JDBC使用,sqlSession.commit();
spring+JDBC/spring+MyBatis
默认自动commit;默认一个操作就是一个独立事务;如果需要封装一组操作,可以采用下面的方法;
## spring事务管理(声明式事务管理,注解配置)
特点:简单,方便,不需要修改原有业务逻辑代码;
使用方法:*.do——>controller——>service(使用事务)——>Dao——>db操作
在spring容器声明一个Bean(DataSoureTransactionManager);
开启事务注解标记@Transactional
在service方法前或类前添加@Transactional标记即可;
## spring事务管理(声明事务管理:xml配置)
特点:基于AOP配置,xml配置比注解复杂,侵入性低;
使用方法:在spring配置一个<bean> (DataSourceTransactionMapper)
定义<tx:advice>:指定事务作用在哪些方法上;
定义<aop:config>:指定事务作用在哪些组件上;
## spring事务管理(编程式事务管理,基于java)
## spring事务属性控制;
Spring AOP概念
Aspect Oriented Programming 面向切面编程;
Object Oriented Programming 面向对象编程;
面向切面编程式以面向对象为基础
面向对象关注的是对象设计;面向切面关注的是切面;
切面特点:共通性(执行功能相同,时机相同),适合解决共通处理问题:
eg:事务处理,日志处理,异常处理,权限处理;
AOP优点:将原有的业务中共通的处理逻辑抽离出来,进行独立封装,然后通过配置作用到原有传统的业务处理
方法上。
简称:将共通业务和传统业务进行解耦,可以避免对大量组件方法做代码级别的修改;
切面(Aspect):在共通时机执行的共通功能,封装了共通处理;
切入点:指定目标组件及其方法,将来执行时调用切面的共通处理;
spring是通过一系列表达式是定切面目标:
方法限定表达式:
execution(修饰符?返回类型 方法名(参数) 抛出异常?)
//匹配所有以load开头的方法:execution(* load*(....));
//匹配org.service包下所有类的load开头的方法:execution(*org.service.*.load(...));
//匹配org.service包下所有类所有方法:execution(*org.service.*.*(...));
//匹配org.service包及子包下所有类所有方法:execution(*org.service.*/*(....));
类型限定表达式:
//匹配UserService所有方法:withion(oeg.service.UserService) withion(org.service.*);
//匹配org.service包及其子包下所有类所有方法:within(org.service..*)
bean(ID名)
//匹配id=userService组件的所有方法 bean("userService");
//匹配id以service结尾的所有方法 bean("*servvice");
通知(Advice)(什么位置切入)
指定切面和目标组件方法执行的时机;
spring提供了5种基本通知类型
前置通知:在目标方法前调用切面处理;
后置通知:在目标方法后调用切面处理(没异常才执行);
异常通知:在目标方法抛出异常后调用切面处理;
最终通知:在目标方法后调用切面处理(有无异常都执行);
环绕通知:在目标方法前和后都可以执行切面处理;
try{
使用前置通知切入
==目标组件方法==
使用后置通知切入
}catch(){
使用最终通知切入
}
## Spring AOP使用方法
功能:为每个Controller的execute方法追加打桩信息;
## 注解配置方法使用
开启组件扫描
开启AOP注解标记
<aop:aspectj-autoproxy/>
使用@Aspect,@pointcut,@Before等标记
## XML配置方式使用
方面:打桩;
切入点:within(org,tedu,cloudnote.controller.*)
通知:在execute原有方法之前配置通知配置;
## spring AOP实现原理
AutoProxy动态代理
spring Aop是采用动态代理技术实现的
动态代理技术,可以根据现有一个组件,动态生成一个新组件;
spring如果为某个目标切入了Aop功能后,spring容器会采用动态代理技术生成一个新组件对象返回,并且在
新组件中将原有组件的业务方法执行了重写,在重写方法里实现了切面组件功能和原目标组件功能的合并;
Controller——>动态代理类(重写userservice方法,调用DataSourceTransaction Manager和UserServiceImpl
方法处理)——>UserServiceImpl(Aop切入事务);