本帖最后由 我是色色 于 2017-12-20 10:32 编辑
Spring事务管理机制Spring事务管理的四个优点: 1. 提供一致的对于不同的事务管理的API 2. 支持声明式事务管理(重点) 3. 编程事务管理(在开发中应用比较少) 4. 优秀的整合与Spring的数据访问 我们重点讲解spring的事务管理的相关的API,还有声明式事务管理 Spring事务管理主要提供了三个接口来完成 1. org.springframework.transaction.PlatformTransactionManager 这是一个事务管理器,可以来选择相关的平台(jdbc hibernate jpa…) 2. TransactionDefinition 它定义事务的一些相关信息 例如 隔离 传播 超时 只读 3. TransactionStatus 它主要描述事务具体的运行状态 PlatformTransactionManager平台事务管理器 在不同的持久化层解决技术它的事务代码不一样。 JDBC开发 Connection con=……; con.setAutoCommit(false);//开启事务 con.rollback(); con.commit(); Hibernate开发 Session session=….; Transaction t=session.beginTransaction(); t.commit(); t.rollback(); PlatformTransactionManager接口API DataSourceTransactionManager 主要针对于JdbcTemplate开发 MyBatis开发 HibernateTransactionManasger主要针对于Hibernate开发 JpaTransactionManager 主要针对于JPA开发。 TransactionDefinition它描述的是事务的定义信息。 在TransactionDefinition中定义了大量的常量 隔离以下是关于隔离性相关信息 事务的四个特性 ACID 原子性 一致性 隔离性 持久性。 不考虑事务隔离性有什么问题? 脏读,不可重复读 虚读。 ISOLATION_DEFUALT 它使用后端数据库的默认隔离级别(spring中选项) ISOLATION_READ_UNCOMMITTED 不能解决问题,会发生脏读 不可重复读 虚读 ISOLATION_READ_COMMITTED 可以解决脏读 会产生不可重复读与虚读。 对于不现的数据库,它的底层默认事务隔离级别不一样。 Oracle数据库它默认的是read_committed Mysql数据库它默认的是repeatable_read. 超时默认值是-1 它使用的是数据库默认的超时时间。 只读 它的值有两个true/false,如果选择true一般是在select操作时 传播它解决的是两个被事务管理的方法互相调用问题。它与数据库没关系,是程序内部维护的问题。 以下定义了事务的传播行为 以上操作中最常用的三种: 两个操作处于不同的事务 PROPAGATION_NESTED
它是一种嵌套事务,它是使用SavePoint来实现的。事务回滚时可以回滚到指定的savepoint,注意:它只对DataSourceTransactionManager有作用 以下了解 TransactionStatus它定义了事务状态信息,在事务运行过程中,得到某个时间点的状态 声明式事务管理事务管理方式1. 编码方案 不建议使用,它具有侵入性。在原有的业务代码基础上去添加事务管理代码 2. 声明式事务控制,基于AOP对目标进行代理,添加around环绕通知。 这种方案,它不具有侵入性,不需要修改原来的业务代码 基于xml配置声明式事务管理方案第一步:在applicationContext.xml文件中添加aop与tx的名称空间 第二步:在applicationContext.xml文件中配置 Spring提供的advice是传统的spring advice 1. 声明事务管理器 2. 配置通知 Spring为我们提供了一个TransactionInterceptor来完成增强 对于这个增强,我们可以使用spring为我们提供的一个标签<tx:advice>来完成操作 3. 配置切面 因为使用的是传统的spring的advice,需要使用<aop:advisor> 基于annotation声明式事务管理方案可以使用@Transaction来在类或方法上添加声明式事务管理 注意:需要在applicationContext.xml文件中使用 相当于开启注解事务控制 问题:关于xml方式与annotation方式的优缺点? 从简单上来说,使用注解更方便。 使用配置的方案,可以对事务配置进行集中维护。 SSH框架整合SSh=struts2+spring+hibernate struts2 2.3.24 spring 4.2.4 hibernate 5.0.7 关于xml配置文件的整合方式SSH整合jar包Struts2框架需要jar包Asm 是关于字节码操作 Commons-fileupload 关于文件上传 Commons-io 关于io流操作工具 Commons-lang 也是一个工具,包含了关于数据与字符串操作 Freemaker 标签库模板文件 Javassist 它也是关于字节码操作,动态代理可以使用它实现(类似于cglib) Log4j关于日志 Ognl 关于ognl表达式 Struts2-core xwork-cor struts2框架底层是使用xwork Struts2与spring整合还需要这个包 如果需要使用struts2提供的json处理 注意:如果使用注解方案,我们还需要导入一个jar包 Hibernate框架需要的jar包Antlr 语法解析包 Dom4j 解析xml Geronimo-jta apache geronimo它是一个开源javaEE服务器 Geronimo-jta是这个开源项目提供jar包,在hibernate中是关于jta事务相关 Hibernate-commoins-annotations 这个包是我们在hibernate下来使用jpa相关的注解,这样它不依赖于hibernate Hibernate-core 开发hibernate必须 Hibernate-jpa 它是关于hibernate对jpa的支持 Jandex 用于索引annotation Javassist 关于字节码操作(注意:strtus2中也引入这个jar包了) Jboss-logging 它是关于jboss统一日志处理 如果使用关于jpa相关操作需要导入jpa依赖jar包 C3p0连接池 还需要数据库相关的驱动jar包 还需要静态日志处理 Spring框架需要的jar包Spring最基本jar包 AOP开发 Spring jdbc Spring 事务管理需要tx Spring整合hibernate Spring整合web开发 如果使用到junit测试 还需要commons-loggin jar包 创建工程完成整合前期准备需要的配置文件: Strtsu2框架 src/strtus.xml Hibernate框架 src/hibernate.cfg.xml 在domain有 Xxx.hbm.xml Spring框架 src/applicationContext.xml 关于日志 log4j.properties 关于数据库连接 db.properties Spring整合hibernate 基本原理:就是由spring来管理hibernate的SessionFactory 方式一:零障碍整合(了解) 我们只需要使用spring中提供的一个LocalSessionFacotry来加载Hibernate的配置文件。 Ssh-xml工程加载到服务器后,如果可以自动创建表,就代表spring整合hibernate ok. 注意:我们必须配置spring的ContextLoaderListener 方式二(spring管理hibernate配置)不在需要hibernate.cfg.xml文件,所有关于hibernate.cfg.xml文件中的配置都在spring的配置文件中来配置。 首先要配置数据源 接下来引入properties文件 创建LocalSessionFactoryBean来完成spring管理hibernate中的SessionFactory 上述的props可以简化成下面方案 加载hbm.xml配置文件 mappingResources它类似于我们之前<mapping resource=””> mappingLocations它加载时是根据类路径加载 classpath:路径 mappingJarLocations它会加载jar文件中的hbm.xml文件 mappingDirectoryLocations 它加载的目录 spring整合hibernate后的DAOspring整合hiberante后,我们的dao只需要继承HibernateDaoSupport类 在HibernateDaoSupport中只需要注入SessionFactory就可以获得到HibernateTemplate,它是对hibernate操作的一个简单封装,可以让我们方便使用原来hibernate的操作. 编写service及测试 测试 事务管理 HibernateTemplate API介绍保存操作 session.save() 修改操作 session.update() file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsFABD.tmp.jpg 删除操作 session.delete() 类似于session.saveOrUpdate()根据持久化对象的状态来判断执行save或update 获取操作 get() load() Find操作 类似于session.createQuery().setParameter().list() 类似于hibernate中的QBC查询,完全的面向对象方案 下面这个可以执行命名查询 可以在User.hbm.xml文件中定义hql或sql Spring整合struts2框架前期准备创建一个addUser.jsp页面创建UserAction类Struts.xml文件中配置 Spring整合struts2原理分析1. spring整合struts2框架必须导入一个jar包 struts2-spring-plugin.jar 2. struts2框架配置文件加载顺序 a. default.properties b. struts-default.xml c. strtus-plugin.xml 3. 在struts2框架中所有的action interceptor result全是bean,在struts2框架中默认是使用strtus2自己bean初化操作. 4. 当我们在工程中导入struts2-spring-plugin.jar文件 就会加载这个包下的strtus-plugin.xml 这时bean的创建由spring来管理。 5. 这时在创建Action时它执行的代码 上述代码,在执行时,首先会从spring容器中来获取,如果获取不到,会buildBean 通过上述分析,spring整合struts2框架它的方式有两种 1. spring管理action(简单说就是在applicationContext.xml文件中来声明action) 2. action自动装配service spring整合struts2框架方式一(掌握)这种方案是基于spring管理action 1. 在applicationContext.xml文件中配置 2. 在action类中 3. 在struts.xml文件 Class的值就是bean的id值 注意:必须在web.xml文件中配置struts2框架的Filter Spring整合struts2框架方式二(action中自动注入service)Struts.xml文件中 Class还是类的全名 这时就会将action类中需要的注入servcie自动注入 在default.properties中有一段配置 这时就会根据名称进行autoWires 我们可以修改注入的方式 我们在struts.xml文件中修改了注入的方式,根据type进行注入 Spring整合struts2框架总结1. 如果在struts.xml文件中<action class=”cn.itheima.action.UserAction”>如果写的是全类名,我们使用action自动装配service方案 2. 如果在struts.xml文件中<action class=”userAction”>这时,在applicationContext.xml文件中要配置<bean id=”userAction” class=” cn.itheima.action.UserAction”> 3. 以上操作的前提是必须导入struts2-spring-plugin.xml文件 在这个文件中它改变struts2的bean工厂 4. 默认情况下如果采用action自动装配service方案,这时每一次请求都会新创建一个action,并且service的装配类型是by name 5. 如果我们采用的是spring管理action这种方案我们必须在<bean>声明中添加scope=prototype”,原因是struts2框架的action每一次请求都应该是一个新的action 关于annotation整合方式Jar包导入在原来的xml基础上在多导入一个jar包 只有导入这个jar包后,我们才能使用struts2框架的注解 @Namespace @Action 配置文件Web.xml文件中要配置 Spring的配置文件 applicationContext.xml Struts2的配置文件 struts.xml 使用JPA注解来定义PO类@Entity 定义实体类 @Table 定义表 @Id 主键 @GeneratedValue 生成主键策略 @Column 定义列 Spring整合hibernateDao编写如何在dao中得到HibernateTemplate对象,原来是在applicationContext.xml文件中通过配置方案注入了一个SessionFactory对象,UserDao的父类HibernateDaoSupport,会帮助我们根据SessionFactory来得到HibernateTemplate Service编写 问题:service需要事务管理,怎样处理? Action编写使用@Controller @Scope 以上注解的作用是由spring管理action,它是一个多例的。 问题:如何完成struts2框架的流程? 基于annotation的ssh整合总结在ssh的annotation整合时,必须要多导入的一个包 对于dao,service,action我们使用 @Repository @Service @Controller来完成bean注册。 在dao中我们使用以下方案将SessionFactory注入,在dao中就可以使用HibernateTemplate 在service及action中使用@Autowire来注入dao及service 一定要在applicationContext.xml文件中开启注解扫描 对于PO类我们使用JPA的注解 @Entiry @Table @Id @GeneratedValue @Column 要在applicationContext.xml文件中配置SessionFactory时来确定扫描包 对于Struts2框架,我们需要@Namespace @Action @ParentPakcage @Result来定义struts2流程 要求action类必须是在action actions struts struts2这样的包中才会扫描struts2相关注解 SSH整合延迟加载问题解决1. 修改UserDao中的findById 2. 添加一个user.jsp页面 3. 在UserAction中处理user_findById请求 以上程序在执行后,报错 解决no session问题: 1. 不使用延迟加载 2. 手动将延迟加载初始化 Hibernate.initialize(延迟对象) 3. 使用spring提供的一个OpenSessionInViewFilter来解决 基本的原理就是将session的关闭操作不在service层完成,而是在web层才关闭session. 注意:openSessionInViewFilter一定要在Struts2 Filter前配置.
{:8_507:}JavaEE三大框架之Spring课堂笔记-10
三大框架之Bean的属性注入-9
三大框架之Spring课堂笔记-8三大框架之Hibernate事务管理7(下)
三大框架之Hibernate注解开发-7(上)
三大框架之Hibernate持久化类与主键生成策略-6
三大框架之Hibernate常用API-5
Java三大框架学习之Hibernate的配置详解-4(下)
JavaEE三大框架课堂笔记之Hibernate快速入门-4(上)
三大框架之Struts2-3
三大框架之Struts2-2
三大框架之Struts2-1
线程精进指南之线程池进阶15个顶级Java多线程面试题及答案
Java String 面试题以及答案
Java IO流学习总结
14个你可能不知道的JavaScript调试技巧
Spring多个AOP执行先后顺序
认识JavaScript中的this
|