Spring_day03笔记
更新时间:2024-07-01 16:42:01 阅读量: 综合文库 文档下载
—高级软件人才实作培训 专家! Spring_day03总结
今日内容
?
?
Spring的事务管理 三大框架整合
上次课的内容回顾:
Spring的AOP开发:
* AOP:面向切面编程,是对OO思想延伸. * AOP底层实现原理:动态代理.
* JDK动态代理:针对实现了接口的类生产代理. * CGLIB代理:针对没有实现接口的类,产生一个子类. * AOP术语:
* JoinPoint:可以被拦截点. * Ponitcut:真正被拦截. * Advice:通知,增强的代码.
* 引介:特殊通知,类级别上添加属性或方法. * Target:目标对象. * Proxy:代理对象. * Weaving: * Aspect:
* Spring的AOP的开发:
* 配置applicationContext.xml生成代理对象. * 使用ProxyFactoryBean类生产代理:
* 根据目标对象是否实现了接口,选择使用JDK还是CGLIB. * 缺点:需要为每个类都去配置一个ProxyFactoryBean.
* 采用Spring自动代理:
* 基于类名称的自动代理:(采用后处理Bean) * 基于切面信息的自动代理:(采用后处理Bean)
* Spring的AspectJ的切面开发.
* AspectJ:本身第三方切面框架. * AspectJ基于注解开发:
* 定义切面:
@Aspect * 定义增强:
1
@Before:前置通知. @Around:环绕通知.
@AfterReturing:后置通知.
—高级软件人才实作培训 专家! @AfterThrowing:异常抛出通知. @After:最终通知. * 定义切点:
@Pointcut
* AspectJ基于XML开发:
* 引入aop名称空间.
Spring的JDBCTemplate:
* 配置连接池:
* 默认 * DBCP
* C3P0(*****)
* 引入外部属性文件.
* 在DAO中注入JdbcTemplate.
* 在DAO中不直接注入模板.Dao集成JdbcDaoSupport. * CRUD的操作.
1.1 Spring的事务管理:
1.1.1 事务:
事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性:
ACID:
原子性:事务不可分割
一致性:事务执行的前后,数据完整性保持一致.
隔离性:一个事务执行的时候,不应该受到其他事务的打扰 持久性:一旦结束,数据就永久的保存到数据库.
如果不考虑隔离性:
脏读:一个事务读到另一个事务未提交数据
2
不可重复读:一个事务读到另一个事务已经提交数据(update)导致一个事务多次查询结果不一致 虚读:一个事务读到另一个事务已经提交数据(insert)导致一个事务多次查询结果不一致
事务的隔离级别:
未提交读:以上情况都有可能发生。
已提交读:避免脏读,但不可重复读,虚读是有可能发生。 可重复读:避免脏读,不可重复读,但是虚读有可能发生。 串行的:避免以上所有情况.
—高级软件人才实作培训 专家! 1.1.2 Spring中事务管理:
分层开发:事务处在Service层.
Spring提供事务管理API:
PlatformTransactionManager:平台事务管理器. commit(TransactionStatus status)
getTransaction(TransactionDefinition definition)
rollback(TransactionStatus status)
TransactionDefinition:事务定义
ISOLation_XXX:事务隔离级别.
PROPAGATION_XXX:事务的传播行为.(不是JDBC中有的,为了解决实际开发问题.) 过期时间:
TransactionStatus:事务状态
是否有保存点 是否一个新的事务 事务是否已经提交
关系:PlatformTransactionManager通过TransactionDefinition设置事务相关信息管理事务,管理事务过程中,产生一些事务状态:状态由TransactionStatus记录.
API详解:
PlatformTransactionManager:接口.
Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现
org.springframework.jdbc.datasource.DataSourceTransactionManager :
JDBC或iBatis 进行持久化数据时使用
使用Spring
3
org.springframework.orm.hibernate3.HibernateTransactionManager
Hibernate3.0版本进行持久化数据时使用
—高级软件人才实作培训 专家! : 使用
org.springframework.orm.jpa.JpaTransactionManager 使用JPA进行持久化时使用 org.springframework.jdo.JdoTransactionManager 当持久化机制是Jdo时使用
org.springframework.transaction.jta.JtaTransactionManager 使用一个JTA实现来管理事务,
在一个事务跨越多个资源时必须使用
TransactionDefinition:
* ISOLATION_DEFAULT:默认级别. Mysql repeatable_read
read_commited
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED ISOLATION_REPEATABLE_READ ISOLATION_SERIALIZABLE
* 事务的传播行为:(不是JDBC事务管理,用来解决实际开发的问题.)传播行为:解决业务层之间的调用的
事务的关系.
PROPAGATION_REQUIRED
* A,B
在一个事务中。)
PROPAGATION_SUPPORTS
* A,B * A,B * A,B
事务互不影响.)
PROPAGATION_NOT_SUPPORTED
* A,B
以非事务方式运行,如果有事务存在,挂起当前事务
非事务的方式运行,A有事务,就会挂起当前的事务.
PROPAGATION_MANDATORY
:支持当前事务,如果不存在,就不使用事务 :支持当前事务,如果不存在,抛出异常
如果A有事务,B使用A的事务,如果A没有事务,B就不使用事务. 如果A有事务,B使用A的事务,如果A没有事务,抛出异常.
如果A有事务,B将A的事务挂起,重新创建一个新的事务.(A,B不在一个事务中.
:支持当前事务,如果不存在 就新建一个
如果A有事务,B使用A的事务,如果A没有事务,B就开启一个新的事务.(A,B是
oracle
PROPAGATION_REQUIRES_NEW如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常 PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
* 基于SavePoint技术. * A,B
* 常用:(重点)
PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW PROPAGATION_NESTED
A有事务,A执行之后,将A事务执行之后的内容保存到SavePoint.B事务有异常
的话,用户需要自己设置事务提交还是回滚.
4
—高级软件人才实作培训 专家1.1.3 Spring的事务管理: ! Spring的事务管理分成两类:
* 编程式事务管理:
* 手动编写代码完成事务管理. * 声明式事务管理:
* 不需要手动编写代码,配置.
1.1.4 事务操作的环境搭建:
CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `money` double DEFAULT NULL, PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; INSERT INTO `account` VALUES ('1', 'aaa', '1000'); INSERT INTO `account` VALUES ('2', 'bbb', '1000'); INSERT INTO `account` VALUES ('3', 'ccc', '1000');
创建一个web项目:
* 导入相应jar包 * 引入配置文件:
* applicationContext.xml、log4j.properties、jdbc.properties
创建类:
* AccountService * AccountDao
在Spring中注册:
5
编写一个测试类:
—高级软件人才实作培训 专家! 1.1.5 Spring的事务管理:
手动编码的方式完成事务管理:
需要事务管理器:真正管理事务对象.
* Spring提供了事务管理的模板(工具类.)
第一步:注册事务管理器:
class=\ 第二步:注册事务模板类: class=\ 第三步:在业务层注入模板类:(模板类管理事务) 第四步:在业务层代码上使用模板: public void transfer(final String from, final String to, final Double money) { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { accountDao.out(from, money); int d = 1 / 0; 6 } } accountDao.in(to, money); —高级软件人才实作培训 专家! }); 手动编码方式缺点: * 代码量增加,代码有侵入性. 声明式事务管理:(原始方式) 基于TransactionProxyFactoryBean. 导入:aop相应jar包. 第一步:注册平台事务管理器: class=\ 第二步:创建业务层代理对象: class=\ 第三步:编写测试类: ***** 千万注意:注入代理对象 @Autowired @Qualifier(\accountServiceProxy\private AccountService accountService; 7 异常不回滚. prop格式:PROPAGATION,ISOLATION,readOnly,-Exception,+Exception —高级软件人才实作培训 专家! * 顺序:传播行为、隔离级别、事务是否只读、发生哪些异常可以回滚事务(所有的异常都回滚)、发生了哪些 ***** 缺点:就是需要为每一个管理事务的类生成代理.需要为每个类都需要进行配置. 声明式事务管理:(自动代理.基于切面 ******) 第一步:导入相应jar包. * aspectj 第二步:引入相应约束: * aop、tx约束. xmlns:context=\ xmlns:aop=\ xmlns:tx=\ xsi:schemaLocation=\ http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd\ 第三步:注册事务管理器; class=\ 第四步:定义增强(事务管理) 第五步:定义aop的配置(切点和通知的组合) cn.itcast.spring3.demo3.AccountService+.*(..))\mypointcut\ 第六步:编写测试类: * 注入Service对象,不需要注入代理对象(生成这个类的时候,已经是代理对象.) 基于注解的事务管理: 第一步:事务管理器: class=\ 第二步:注解事务: 第三步:在Service上使用注解 @Transactional * 注解中有属性值: * isolation * propagation * readOnly 9 ... —高级软件人才实作培训 专家! 1.2 SSH框架整合: 1.2.1 Struts2+Spring+Hibernate导包 Struts2导入jar包: * struts2/apps/struts2-blank.war/WEB-INF/lib/*.jar * 导入与spring整合的jar * struts2/lib/struts2-spring-plugin-2.3.15.3.jar * struts2/lib/struts2-json-plugin-2.3.15.3.jar * 配置 web.xml eFilter struts.xml Spring导入jar包: Spring3.2 开发最基本jar包 spring-beans-3.2.0.RELEASE.jar spring-context-3.2.0.RELEASE.jar --- 整合Spring框架 --- 整合AJAX --- 使用Struts2注解开发. * struts2/lib/struts2-convention-plugin-2.3.15.3.jar 10 spring-core-3.2.0.RELEASE.jar spring-expression-3.2.0.RELEASE.jar —高级软件人才实作培训 专家! com.springsource.org.apache.commons.logging-1.1.1.jar com.springsource.org.apache.log4j-1.2.15.jar AOP开发 spring-aop-3.2.0.RELEASE.jar spring-aspects-3.2.0.RELEASE.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar Spring Jdbc开发 spring-jdbc-3.2.0.RELEASE.jar spring-tx-3.2.0.RELEASE.jar Spring事务管理 spring-tx-3.2.0.RELEASE.jar Spring整合其他ORM框架 spring-orm-3.2.0.RELEASE.jar Spring在web中使用 spring-web-3.2.0.RELEASE.jar Spring整合Junit测试 spring-test-3.2.0.RELEASE.jar (Spring没有引入c3p0和数据库驱动) * 配置: applicationContext.xml Log4j.properties 在web.xml中配置监听器; er-class> Hibernate的jar包导入: * 核心包:hibernate3.jar 11 * lib/required/*.jar * lib/jpa/*.jar —高级软件人才实作培训 专家! * 引入hibernate整合日志系统的jar包: * 数据连接池: * 数据库驱动: * 二级缓存:(可选的.) * backport-util-concurrent.jar * commons-logging.jar * ehcache-1.5.0.jar * Hibernate的配置: * hibernate.cfg.xml * 映射: * 格式:类名.hbm.xml 1.2.2 Struts2和Spring的整合: 1.新建包结构: * cn.itcast.action * cn.itcast.service * cn.itcast.dao * cn.itcast.vo 2.创建实体类: * Book 3.新建一个jsp页面: * addBook.jsp 图书名称: 4.编写Action: public class BookAction extends ActionSupport implements ModelDriven private Book book = new Book(); public Book getModel() { } return book; 12 // 处理请求的方法: } } 5.配置struts.xml —高级软件人才实作培训 专家! public String add(){ System.out.println(\层的添加执行了...\return NONE; 1.2.3 Struts2和Spring的整合两种方式: Struts2自己管理Action:(方式一) * Struts2框架自动创建Action的类. Action交给Spring管理:(方式二) 可以在标签上通过一个伪类名方式进行配置: 在spring的配置文件中: 推荐使用二: * 在Spring中管理的类,可以对其进行AOP开发.统一的管理. Web层获得Service: 传统方式: * 获得WebApplicationContext对象. * 通过WebAppolicationContext中getBean(“”); 13 实际开发中: —高级软件人才实作培训 专家! * 引入了struts2-spring-plugin-2.3.15.3.jar * 有一个配置文件 : struts-plugin.xml 开启常量 : 引发另一个常量的执行:(Spring的工厂类按照名称自动注入) struts.objectFactory.spring.autoWire = name 1.2.4 Spring整合Hibernate: Spring整合Hibernate框架的时候有两种方式: 零障碍整合:(一) 可以在Spring中引入Hibernate的配置文件. 1.通过LocalSessionFactoryBean在spring中直接引用hibernate配置文件 class=\ 2.Spring提供了Hibernate的模板.只需要将HibernateTemplate模板注入给DAO. * DAO继承HibernateDaoSupport. 改写DAO:继承HibernateDaoSupport类. public class BookDao extends HibernateDaoSupport{ public void save(Book book) { } } System.out.println(\层的保存图书...\this.getHibernateTemplate().save(book); 14 3.创建一个映射文件 : —高级软件人才实作培训 专家! 4.别忘记事务管理: 事务管理器: class=\ 5.注解管理事务: 6.在业务层类上添加一个注解: @Transactional 没有Hibernate配置文件的形式(二) 不需要Hibernate配置文件的方式,将Hibernate配置文件的信息直接配置到Spring中. Hibernate配置文件中的信息 : * 连接数据库基本参数: * Hibernate常用属性: * 连接池: * 映射: 把Hibernate配置文件整合Spring中: 连接池: 15 —高级软件人才实作培训 专家! Hibernate常用属性: 映射 1.2.5 HibernateTemplate的API: Serializable save(Object entity) void update(Object entity) void delete(Object entity) :保存数据 :修改数据 :删除数据 :根据ID进行检索.立即检索 :根据ID进行检索.延迟检索. :支持HQL查询.直接返回List集合. :离线条件查询. List findByNamedQuery(String queryName, Object... values) :命名查询的方式. 16 —高级软件人才实作培训 专家! 1.2.6 OpenSessionInView: 1.3 基于注解的方式整合SSH: 导入以上工程jar包: * 导入struts2的注解开发: * struts2-convention-plugin-2.3.15.3.jar * web.xml: lass> er * 创建包结构: * 引入spring的配置文件、log4j、jdbc属性文件. * 创建页面: * 创建Action: @Namespace(\ 17 @ParentPackage(\ private Book book = new Book(); public Book getModel() { } @Action(value=\ public String add(){ } } return book; public class BookAction extends ActionSupport implements ModelDriven —高级软件人才实作培训 专家! System.out.println(\层添加图书...\return NONE; * Action---Service----Dao 将各层类使用注解装配Spring中: @Controller @Service @@Repository 完成属性注入: @Autowired @Qualifier(\ * 实体类: @Entity @Table(name=\public class Book { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; @Column(name=\ private String name; private Double price; public Integer getId() { } public void setId(Integer id) { } public String getName() { } return name; this.id = id; return id; 18 public void setName(String name) { } public Double getPrice() { } return price; this.name = name; —高级软件人才实作培训 专家! public void setPrice(Double price) { } @Override public String toString() { } } * 事务管理: * 模板注入: return \this.price = price; 今天内容总结: Spring的事务管理: * 编程式事务:(了解) * 声明式事务: * TransactionProxyFactoryBean. * AOP和事务配置:(*****) * 基于注解事务管理:(*****) SSH整合: * SSH整合(带有hibernate配置文件) * 导包: * 配置文件: * Struts2+Spring * 两种方式: * Action的类由Struts框架创建. * Action的类由Spring框架创建.(scope=”prototype”) * Spring+Hibernate: * 在Spring框架中引入Hibernate的配置文件. * 管理事务: * DAO中注入sessionFactory. * SSH整合(不带Hibernate配置文件) * 导包: 19 * 配置文件: * Struts2+Spring * 两种方式: —高级软件人才实作培训 专家! * Action的类由Struts框架创建. * Action的类由Spring框架创建.(scope=”prototype”) * Spring+Hibernate * 把Hibernate配置信息配置到Spring中 * 管理事务: * DAO中注入sessionFactory. * SSH注解.(**) * Struts2: * 在Action的类上 * @Namespace(“/”) * @ParentPackage(\ * 在要执行的方法上: * @Action * 把Action/Service/Dao交给Spring. * Action: @Controller(\@Scope(\* Service @Service * Dao @Repository * 配置Spring中自动扫描; base-package=\ * 映射: @Entity @Table(name=\public class Book { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; @Column(name=\private String name; ... } 20 * 配置SessionFactory: —高级软件人才实作培训 专家! class=\ * 事务管理: class=\ * DAO中使用Hibernate模板: * 手动注入HibernateTemplate : class=\ @Autowired @Qualifier(\ private HibernateTemplate hibernateTemplate; key=\ 21 * 配置SessionFactory: —高级软件人才实作培训 专家! class=\ * 事务管理: class=\ * DAO中使用Hibernate模板: * 手动注入HibernateTemplate : class=\ @Autowired @Qualifier(\ private HibernateTemplate hibernateTemplate; key=\ 21
正在阅读:
Spring_day03笔记07-01
郑州大学建设工程监理组织试题07-11
循环流化床锅炉脱硝技术方案(详)04-04
集控巡视员(中级)10-15
济阳县2013年七上语文期中题及答案03-04
用Oracle闪回功能恢复偶然丢失的数据08-25
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 笔记
- Spring
- day
- 03
- 3.4因特网多媒体技术(粤教版)学案
- 铁路工程监理规划
- ILS系列一体化生活污水处理设备
- 财务分析主观题(答案)
- 融资租赁的主要形式
- 单片机项目报告(提纲)
- 公共政策分析教案
- 中等职业学校酒店服务与管理专业申报材料
- 2015-2016学年广东省惠州市三新小学四年级(上)月考数学试卷和
- 王安忆
- 2014-2015学年江西省宜春市奉新一中高二(下)期末物理试卷
- 正反作用
- 河南省平顶山市2016-2017学年高二下学期期末调研考试数学(文)试
- 第七章 数组
- 最新长春版小学语文五年级下册《腊八粥》公开课教学设计(1)
- 专题强化测评(三)A卷
- 高中数学选修2-3 北师大版 第1章 §3 第1课时3 组合 作业(含答
- 毕业设计 飞机刹车系统常见故障和维修技术
- 工程热力学答案
- 海尔 MRV 5E中央空调 故障代码表