00:00
各位同学大家好,前面呢咱们已经完成了基于注解方式进行声明式事务管理,那下面呢,给大家来演示基于插文件进行生命式事务管理,那咱们开始做一下这个过程。怎么来实现呢?给各位把这个过程咱做个分析,然后进行实现。我这里特别说明啊,咱们配置事物呢,其实它底层用到就是A的思想,面向切面编程。然后咱们下面把步骤来分析一下,首先第一步我们先做一个环境的准备,就是咱们一会儿我们建个新的包,然后创建controller service do,咱们重新进行演示,这是第一部分,然后第一分之后我们的第二部分咱们就是创建配置文件。我这里写一下啊,就是配置文件,在配置文件中呢,主要完成里边的具体内容。
01:01
然后怎么完成,咱们具体写一下。首先我们的第一部分,那就是开启这个组件的扫描,就咱用注解方式创建对象,然后第二部分呢,我们做什么呢,肯定是。创建我们那个数据源,就是咱们说的it,然后之后我们创建这个JDBC。并且在里边注入这个数据源,然后之后呢,第四步咱们创建这个叫事物管理器,并且里边注这个数据源,就是之前我们做的这个过程,然后咱把它分别进行实现,当然这个写的时候呢,各位注意啊,因为咱们是基于配文件方式进行实现,所以写的时候咱们就不需要再写这段话。就是这个开启事物的注解驱动,因为这是注解方式,咱目前用配置文件进行实现,这是咱们一会儿做到的,然后这个之后我们继续来看啊。
02:07
咱们的第五步操作,也就是事物的部分,那怎么做呢?咱们先配置一个就是。事物的这个通知,因为咱们也可以理解为我们现在要做的就是一个增强或者做一个通知,咱做什么增强就是事物,就是我的增强,我要在当前功能中加上一个事物,所以咱们先配置事物的通知,然后配置之后第六部分我们就是通过这个叫做切入点表达式来最终把这个。通知,或者把事物的这个通知添加到你的方法上,这个是我们要做的事情,也就是咱们通过配置文件,基于a op的思想,把这做到配置事物的通知,或者说增强,然后配置切入点表达式,把通知添加到你的具体方法中,然后在里边我们配置事务通知的时候,可以设置事物中一些相关的属性,比如说是否只读啊,你的这个回滚策略,超时时间等等。
03:13
所以以上就是咱们一个基本步骤的分析,各位把这先知道。然后这个分析之后,下面呢,我们按照过程把这个具体的基于X买lo进行生命实事管理,咱们开始进行实现,那下面我们来做一下这个过程啊,首先第一部分我在里边呢,咱们重新建个新的包,这个包我就叫叉LTX就是叉方式,这是事五。然后写完之后,我把这里边相关类咱就复制过来,因为之前都写过,咱复制之后最终给他快速改一下,我们做一个最基础的演示就可以了,那咱们啊给他做一个复制。呃,这个啊,写错位置啊,我重新复制一下啊。
04:01
Controller service DA,还有这个测试类,把这部分我们都复制到这个新的包里面来。咱给他拿过来。然后复制之后,我们给查一下啊,首先在里边呢,我就不写这个checkout service,咱就加service,还有do这个给它就删掉了。给它去掉啊,然后咱们改一下,我们看到啊,在book control里边,首先CL创建对象,然后咱们注入book service,注入之后调用里边的方法,就这个方法叫。百不可最终实现,这个我就给它去掉了啊。咱们做一个这个买书的过程,然后现在我在里边把service给他注入进来。咱们做一个注入啊,注意别注入错啊,是我们当前里边这个字。然后注入之后我们来到它的实现类中,就是这个。
05:03
看到啊,在实现类中,我们就是调用DA中的方法进行实现,这些我现在都给它去掉了啊,但之前也是那个使用中测试过,先给它去掉。这里给它拿掉,保留一个最基础一个环境,包括你看啊,在这里边是不是有一个trans这个注解,这个需要去掉,因为咱用配置文件做的,注意啊,这个不要忘记要给它去掉。现在这个完成,然后咱们最后再看一下do里边有咱们三个方法,通过BC应该之前都做了实现,所以这是一个最基本的准备工作,然后最后有个测试方法,咱们这里边比如我做一个调用啊,调里面那个摆book,咱传入这个参数。后面咱们进行测试。这是一个环境的准备配置文件改一下啊,我改成这个,就是这么改啊,改成B。
06:01
BS杠叉L啊,用这种方式进行实现。这个我们先讲到这里,然后之后呢,我们进入到第二部分,咱们创建齿轮的配置文件。我在里边进行创建。点。差买了。这个文件。咱们基于它进行我们最终的配置,那咱们啊,最后来写这个配置部分。配置里边怎么做呢?首先第一部分啊,先开启组件扫描,我来写一下啊,开启组件扫描,那咱们给他开启一下。这里边需要有它的相关的这个约束,我把这约束从我们这里边给它就复制过来。也就是里边的这些啊,给它都拿过来啊,有些可能暂时用不到,咱给他也都复制过来了。这个复制一下。拿到我们这里边来。
07:00
然后复制之后,我们写第一个开启组件,扫描我们加上comment,开加上包的这个路径。com.at硅谷点文六点上这个叉LTX。我们扫描这个包里面的内容,这是第一部分,然后第二部分呢,我们就创建这个数据库连接池的对象,或者说你的数据源的对象,这个经创建,因为这个部分呢,咱们之前写过,所以我从之前里边我就把它直接就复制过来了,也就是里边的这个部分。把麦啊拿过来。大家看啊,引入外部属性资源文件,也就是我们里边的这个jbc property,然后里边有数据库的相关部分,咱们在这位置创建这个对象,就是德鲁伊连接池对象,通过表达式把它的值我们依次取到,这就是数据源的对象部分。
08:04
然后这个之后下面呢,我们写这个就是JDBC这个对象。把这个对象进行创建,并且注入我们刚才创建这个数据源。那咱们啊,快速写一下。我们加上一个B。ID以及class。然后在里边呢,加上它的名字,包括它那个路径啊,我们写这个路径就是D个路径,然后起个字就叫GDBC它们里头。写完之后在里边呢,注入他这个数据源。就是data source,然后加上这个德鲁的数据,这个完成完成之后下一步操作咱们创建这个事务管理器。把这个做到,然后在管理器中也是注入这个数据源,因为之前写过,我从之前里边啊,咱就给它快速复制过来了,也就是这个。
09:05
把它拿过来。咱们拿到这里啊,然后大家看一下就是。Data source manager里边注入source,所以现在啊,大家看这部分我们就完成了,就咱们一个最基本的准备,也就是刚才我分析过程中的前四部分,我们就都做到了。前四部分完成之后,下面呢,我们做第五部分,配置事物的通知,或者配置这个事物的增强,设置事物属性,然后通过切入点表达式把通知添加到咱的具体的方法里面去,那我现在在里边配置一下。给各位写到下边,咱们写一下啊,就是配置事物的这个增强或者说通知,然后设置相关的属性,那怎么做呢?写一下啊,咱们刚才有这么一个约束,叫TX给咱加上一个叫做TX冒号advice。
10:07
这表示配置增强,或者通知给它起个名字,这个名字随便起啊,我就叫t X advice。然后在里边指定你用的是哪个事物管理器,咱用的是它manager。把这个加上,然后加上之后我们继续往下来看啊,在里边呢,我们加上下一个标签叫ts attributes,看这个单词是不是属性啊,加S就是很多属性,咱就怎么做呢,设置一下你这个事物的就是方法的规则,就是对哪个规则的方法,我们加上这个事物,并且设置它相关的属性,那什么意思呢?给大家举个例子啊,比如说我现在这么来写,我加个盖星号。什么意思?就表示以get开头的这种类型的方法,咱们做操作后面有很多属性,比如大家看啊这么多属性,你看第一个这是什么。
11:09
咱说过是不隔离级别,这是你那个回滚策略,这是什么传播行为,是否只读,然后这是超时时间,那比如说我加一个叫read only等于true,那就表示这个规则的方法只能做查询操作,不能做增加修改深入操作,这是咱们写的一个规则。那大家看一下啊,我现在的方法中,各位看这方法里边,大家看这个这方法是不是以get开头,所以在让这种方法只能做查询,不能做增加修改删除,那比如说我可以再写一个啊,咱再来一个叫t method,那我写个什么呢?我加这个。Update号,这update开头方法,大家看我这两方法是都是以update开头,然后咱们在里边,比如这里边我加一个read only等于false,你就不能等于了,因为等于的话呢,那它里边啊,它就不能做修改操作了,但你发现啊,这边有个细节地方。
12:13
各位看啊,我这个还有这个是不是都是灰色呀,什么意思,它就表示啊,你这个不写默认值,就是它比如这个false不就false这个I,因为它认名字,就因为它跟一如果不如。你看这里是不是报错了,我这里也必须叫一啊,跟他要一致。如果你是这个名字,那你默认可以不写这个,注意啊,包括里边有其他部分,比如说我们加上这个。Prop表示传播行为,它认值,是的,我们可以加上等啊,做一个测试,当然你可以再加上其他的规则,我就写这两个get开头,R的开头,当然可能还有别的方法。
13:00
这个啊,是我们提到的这个相关的特点。然后这个写完之后,咱们下面继续往下来写,下面写什么呢?我写到这个位置,那咱们就是配置我们的这个切入点。包括你这个增强。或者说我们的通知啊,通知使用的那个方法,就是把这增强用在我们的具体方法上,通过切入点表达式最终进行实现,那咱来写一下啊,看这个怎么做,首先加上一个叫a op。Config。就加上他。后1A切入点,咱给它起个名字,比如叫这个啊,随便我就要P啊,这里边上表达式,这表达式就是咱之前说那个,我这里写一下啊,加这个execution。
14:03
然后星号加上你的一个方法,那个就是路径,我把这个复制一下啊,方法是在这个位置。我就加上他。然后加上这个这个路径。上一个咱就来个星号了啊,再点上一个星号,然后加上括号里边两个点,就表示这个包装所有类中的所有方法,咱们做这个事物的一个添加啊,这是写一个切认表示,或者你写上你具体的某个类也是可以的,我就来了啊。然后写完之后,咱们在里边就是把切入点表达式,通过它把通知用在我们的具体方法上。那我加一下啊,大家看这个。叫a op。然后里边你看第一个指的是你的知,加上咱们这个知这个ID,然后第二个叫做F,加上你这个切入点表达式的这个ID名字,现在就完成这个添加,把我们的知用在咱这个方法上,通过切热电表达式设置你在哪个方法上要用到这个事物。
15:19
所以现在啊,这一部分我们就完成了。以上啊,是咱们演示的基于XM配置文件,实现事物的配置,主要就是这个过程。所以大家发现啊,这个写法呢,比注解其实要复杂很多,所以实际中咱们很多时候都是用注解实现,因为它更加方便配置文件,它要写很多部分,包括增强,包括表达式啊,包括设的一个过程。但这个各位要能看懂,所以咱们现在完成完成之后呢,最后把效果咱试一下啊,试一下这个效果,那咱们看怎么试啊,首先我把这个数据咱先给他稍微看一下啊,我们看啊图书里边我改成这个200,就这本书200。
16:07
然后现在各位看啊,我这个余额咱就写个呃,这个50啊,写上他,而现在过程中,当我买书的话,我先扣库存减一,但是我这个余额是50 50肯定买不了这个书,最终会出错,出错的话如果事物生效,那我库存不会少,余额还是50,他应该做了一个回滚,那我们试一下这个结果啊。咱们做个测试,来到这个测试类中。测试类里边呢,改个地方啊,把配置文件改成我们当前的配置文件,别改错slo,然后在里边我们这个ID是一的书,用户ID是一进行购买,最终执行看结果啊,咱们做个测试就验证一下这效果到底对不对。然后自己试的时候注意这些包不要导错啊,是咱们当前这里面的。
17:02
大家看啊,他报这个错,因为现在啊,它里面有那个负值,它肯定是加不进去的,咱做的是无符号这个值,现在看表中的变化,先看库存量刷新。咱发现啊,这里变成了199,然后再看这个值它没有变啊,咱发现目前好像出了点问题啊,那咱们检查一下啊,是哪里不对,正常来讲应该是这个值是不变的,它应该是做了回滚效果,大家看一下啊,是哪里写的不对,我们检查一下啊。大家看啊,我们的配置文件中呢,各位看这个位置,它表示就是以什么开头的方法,我们做这事物,但是这个方法指的是什么呢?是你那个事物里边那个就是你事物的方法,咱目前事物方法大家看啊,我用确认表达式配置是不是service里边的方法,而我刚才说的这个,这是不是在do里边呀,因为咱没有配置do,所以你要配置service里边方法规则,我service方法是不是叫它不叫也不叫update,所以证明问题在这里,因为没有配置这个规则的方法,我的规则写了update了,跟我没啥关系,我要配置你这个就是事物这个service类里这个方法,根据它来进行操作。
18:22
这个不知道我是否说清楚了啊,我再说一遍,咱现在配置这个规则的,就这个规则方法,你要配置到你这个service这一层里边的这个类的方法,而不是do,因为咱们切入点表达式把物是加到service层,所以给他改一下啊,咱们这里边我就直接复制了啊,再加上一个方法,刚才咱验证没有生效,因为这规则不对。那这个规则呢,是以这个BY开头,咱们叫by book啊,以它开头,那我加上这个就是它不是只读啊,并且用的是铝块的。这两只虽然都是默认的,但也写一下啊,然后这个写完之后,咱们再做个测试,我把值给它还原回来。
19:07
还是200,然后这个值是50啊,咱们再试一下啊,看一下最后结果,因为这么看各位更好理解,如果一次性都成功,你看不到效果什么样啊,看不到错长什么样,咱先个错误,然后再把这个最终做验证,主要这个地方注意是你service类里边那个方法的规则。最终执行看结果啊。然后这个错误肯定还是刚才那错误,咱就不看了啊,咱就看数据库里面变化,先看库存刷新。大家看是不是200,再看余额还是50,是不是它没有变,因为它进行了事物的回滚。所以说以上咱就完成了事物的相关操作,咱们分别演示了基于注解方式进行声明式事务管理,以及基于叉L配置文件方式进行事务管理。
我来说两句