Spring_four
阅读原文时间:2023年07月08日阅读:1

Spring_four

基于XML的AOP实现事务控制

坐标xml

删除AccountServiceTest测试类上的@Qualifier的注解,不产生代理对象

此时事务没有控制住


【配置文件】添加spring的aop

applicationContext.xml


可以使用【前置通知】、【后置通知】、【异常通知】、【最终通知】

坐标

配置AccountServiceImpl.java的注解

配置AccountDaoImpl.java的注解

配置ConnectionUtils.java的注解

配置TransactionManager.java的注解

配置spring容器

配置applicationContext.xml

text

但是发现,抛出异常。

因为注解的方式执行顺序是【前置通知】、【最终通知】、【异常通知】/【后置通知】

我们需要使用环绕通知解决问题。

配置TransactionManager.java


1\dbcTemplate概述

它是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。

操作关系型数据的:

JdbcTemplate (操作JDBC,操作数据库)

HibernateTemplate (操作hibernate,操作数据库)

操作nosql数据库的: RedisTemplate(操作Redis,非关系型数据库)

操作消息队列(MQ)的: JmsTemplate (操作ActiveMQ,消息队列)

* 短信平台

* 邮件平台

操作索引库的:ElasticSearchTemplate(操作ElasticSearch,全文检索)

我们今天的主角在spring-jdbc-5.0.2.RELEASE.jar中,我们在导包的时候,除了要导入这个jar包外,还需要导入一个spring-tx-5.0.2.RELEASE.jar(它是和事务相关的)。


坐标xml

创建类Account.java

创建类JdbcTemplateDemo1.java

使用spring提供的数据源


2\使用spring容器创建数据源和JdbcTemplate

配置applicationContext.xml

创建JdbcTemplateDemo2.java


3\使用JdbcTemplate操作数据库的CRUD

创建测试类JdbcTemplateDemo3.java


4\ JdbcTemplate操作Dao

创建AccountDao接口

创建接口的实现类AccountDaoImpl.java

applicationContext.xml

test


5\ Spring提供JdbcDaoSupport的使用

使用AccountDaoImpl继承JdbcDaoSupport,实现AccountDao

applicationContext.xml

test


6\ 使用JdbcDaoSupport的注解开发

创建AccountDao接口

创建AccountDaoImpl2实现AccountDao

applicationContext-anno.xml

重新创建applicationContext-anno.xml演示,表示使用注解

test


1.1 Spring事务控制我们要明确的

第一:JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案。

第二:spring框架为我们提供了一组事务控制的接口 。具体在后面的第二小节介绍。这组接口是在spring-tx-5.0.2.RELEASE.jar中。

第三:spring的事务控制都是基于AOP的,它既可以使用编程的方式实现,也可以使用配置的方式(声明式)实现。我们学习的重点是使用配置(声明式事务处理)的方式实现。

1.2 Spring中事务控制的API介绍

1.2.1 PlatformTransactionManager

此接口是spring的事务管理器,它里面提供了我们常用的操作事务的方法,如下图:

我们在开发中都是使用它的实现类:

真正管理事务的对象

org.springframework.jdbc.datasource.DataSourceTransactionManager 使用Spring JDBC或myBatis 进行持久化数据时使用

org.springframework.orm.hibernate5.HibernateTransactionManager 使用Hibernate版本进行持久化数据时使用

JpaTransactionManager,使用Jpa操作持久化数据时使用

1.2.2 TransactionDefinition

它是事务的定义信息对象,里面有如下方法:

1:事务的隔离级别

2

2:事务的传播行为

REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)

SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)

MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常

REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起,从新开启一个新的事务。

NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起

NEVER:以非事务方式运行,如果当前存在事务,抛出异常

NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作。

3:事务超时时间

默认值是-1,没有超时限制。如果有,以秒为单位、会进行设置,在事务提交/回滚后多长时间,事务失效。

4:是否是只读事务

建议查询时设置为只读。

增删改设置可写。

1.2.3TransactionStatus(了解)

此接口提供的是事务具体的运行状态,方法介绍如下图:


坐标xml

AccountDao.java

AccountDaoImpl.java

AccountService.java

AccountServiceImpl.java

applicationContext.xml

test


编程式事务控制

Jdbc的操作,需要配置Jdbc的事务管理器

配置applicationContext.xml

配置事务管理模板

配置applicationContext.xml

在业务层注入事务管理模板

配置applicationContext-tx1.xml

AccountServiceImpl.java


配置applicationContext.xml

同时去掉:TransactionTemplate的操作


注解

配置AccountDaoImpl.java

配置AccountServiceImpl.java

注意:方法级别的事务会覆盖类级别的事务

配置applicationContext.xml

Spring整体的总结:

总结:

1:IOC DI(xml和注解)

2:AOP(5种通知)(xml和注解)

3:声明式事务处理(xml和注解)

  • * DBUtils(第三方提供的)
  • * JDBCTemplate(是spring提供的)

4:spring3的新特性(纯注解开发)

自己创建的对象:使用注解

第三方创建的对象(数据源…):使用配置文件