Spring_day03笔记

更新时间:2023-03-08 07:10:33 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

—高级软件人才实作培训 专家! 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

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecut

eFilter

struts2 /*

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中配置监听器;

org.springframework.web.context.ContextLoaderListener

er-class>

contextConfigLocation

classpath:applicationContext.xml

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常用属性:

映射

classpath:cn/itcast/vo

1.2.5 HibernateTemplate的API:

Serializable save(Object entity) void update(Object entity) void delete(Object entity)

:保存数据

:修改数据 :删除数据

:根据ID进行检索.立即检索 :根据ID进行检索.延迟检索. :支持HQL查询.直接返回List集合. :离线条件查询.

T get(Class entityClass, Serializable id) T load(Class entityClass, Serializable id) List find(String queryString, Object... values) List findByCriteria(DetachedCriteria criteria)

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:

org.springframework.web.context.ContextLoaderListener

lass>

contextConfigLocation

classpath:applicationContext.xml

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilt

er

struts2 /*

* 创建包结构:

* 引入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=\

* 在Dao中

@Autowired

@Qualifier(\

private HibernateTemplate hibernateTemplate;

key=\

cn.itcast.vo

21

* 配置SessionFactory:

—高级软件人才实作培训 专家! class=\

* 事务管理:

class=\

* DAO中使用Hibernate模板:

* 手动注入HibernateTemplate :

class=\

* 在Dao中

@Autowired

@Qualifier(\

private HibernateTemplate hibernateTemplate;

key=\

cn.itcast.vo

21

本文来源:https://www.bwwdw.com/article/b7c.html

Top