开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术:Transaction接口】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/80/detail/15948
Transaction接口
内容介绍:
一、事务
二、设计模式
一、事务
最后一部分是这个绿色的代码,此代码跟事务有关。
在 MyBatis中,大家在使用事务时都是用 Transaction这样的注解,在 Bean的方法前面;Bean 的方法进去的时候开启事务,Bean 的方法结束的时候会关闭事务,事务的开启和关闭并不是由代码来完成的,而是由 Spring 的容器来完成的,我们称
之为容器管理的事务。如果不想用容器来管理事务,我们可以去调 SqlSession对应的方法,自己来写这事务,就是在代码的任何一段开启一个事务,然后在中间把它
结束都可以,不是一定要在方法的开始和结束时开启事务,所以这里的事务有两
种:一种就是由 Bean容器管理的事务,一种是自己来写代码开启的事务,就是
Transaction下面的两个实现,一个是 JdbcTransaction,另一个是
ManagedTransaction。
无论在使用哪一种事务,我们都不希望让其它代码受到影响,所以给它实现了同样的接口,这样使得我们用哪种事务都是无关的,从小的局部来说是同样可以认为这是一个适配器的设计模式,但它关键有区别的地方在于 TransactionFactory,因为这两种事物的构造的方式不一样,容器的管理的 Transaction更复杂一些,所以它构造这两种Transaction的过程和构造所需要的信息是不一样的,那就要写两个不同的构造方法,所以做了两个 Factory的方法,一个负责构造 Managed的Transaction,叫做 ManagedTransactionFactory;另一个负责构造 Jdbc的Transaction,叫做 JdbcTransactionFactory。它用了两个 Transaction的 Factory的
类去实现了一个相同的接口,叫做TransactionFactory。
二、设计模式
这个设计模式称之为抽象工厂的设计模式。前面讲过工厂设计模式:就是在一个类里面写一个方法,这个方法互相来构造对象,然后把这个构造对象的逻辑藏在这个类的方法里面,这就是我们称之为简单工厂的设计模式或者工厂方法的设计模式。
那这个抽象工厂的设计模式其实是工厂设计模式的升级版。
1、抽象工厂的定义
它认为整个里面是分为产品和工厂,Transaction 相当于工厂的造出来的产品,而旁边有很多对应工厂来造对应的产品,这样就形成了两个继承的关系:一个是产品的继承关系,另一个是工厂的继承关系,然后产品和工厂之间存在着一一对应的关
系,这就是抽象工厂的定义。
2、抽象工厂的作用
我们在分析面向对象设计时,首先要找准它要解决什么问题,再说它用什么方式来解决这个问题的。抽象工厂的使用要解决的问题就是:Transaction
对象是会放在很多地方的,比如 SqlSession 里面,因为它要知道这个事务在执行的时候是怎么控制的;Executor 也要放T ransaction对象,关键问题在于,放
Transaction 对象的时候放哪个?我们可以让 SqlSessionFactoryBean 来负责构造Transaction 对象,但是现在有两种对象在构造,因为构造的方法有很大差异,所以希望这两个构造方式也分开。
因此在 SqlSessionFactoryBean中间关联的是Factory的对象,构造的就是 Factory的对象,所以往 SqlSessionFactoryBean里面放什么样的 Factory,它就会构造出什么样的 Transaction,它是这样的机制。这就是抽象工厂的用途,它的作用是保护的变化,不仅保护了我们要放什么样的 Transaction进去,而且把怎么造Transaction 的部分也保护起来了。造的方式不同,放的东西也不同,不同的方式造不同的东西,最后还要把这个不同的东西给它放进去,所以它把造的不同东西的
方式和放不同东西的两个变化都保护起来了。
3、抽象工厂的方法
如果以后有第三种 Transaction,不知道是否还有T ransaction,那就是在Transaction下面加一个子类,在 TransactionFactory下边再加一个子类,然后把它放到 SqlSessionBean的FactoryBean里面,就能造出来我们需要的Transaction。这个开关通常是用配置的信息来开关的,所以在配置里面我们用哪种容器的方式或者在某部分用事务开关的方式,就会实例化不同的 Transaction对象,放进去它就会
造出不同的东西,这是抽象工厂的方法。
我们在这个类图上面直接就能看到:有代理的方法、适配器的方法、适配器的设计模式,除了这三种设计模式,在这张图里面还有其它的设计模式,但我们需要去看
它的动态模型,看其它的设计模式是怎么用的。