00:00
我们这一节课呢,就来说我们这个enable trans management的这个简单原理,其实这个原理呢,跟我们之前分析那个O兼auto proy原理是一模一样的,那我们可以不用走原码,我们直接点进去,我们来分析一下,点进去这个注解呢,我们会发现它用import又导入了一个叫select,那我们把这个步骤来写上,首先咱们这个原理,为什么我们这个注解能工作第一步我们这个注解利用利用它会呢,导入咱们这个select,利用这个select给容器中,给容器中会导入组件,因为它是一个select,相当于要导哪些组件,这些select呢,会帮我们来返回这些组件的权利名,我们以前呢用过这种模式。
01:00
我们可以看一下,这个呢,咱们点进去,这其实就是这个import,那么呢,我们来看一下这个它是怎么写的呢?好,它呢在这里边判断了一下,说advice mode,如果是proy,就会返回string数组,String数组呢就是这个类名和这个类相当会导入这两个组件,如果是SP接就会导入下边的这个东西,那么呢,我们就来看一下这个advice mode是什么呢?那就是我们这个enable trans management,我们里边会定义一个属性叫mode,但是呢,默认就是pro,所以说呢,相当于它会给我们容器中导入两个组件,一个叫o prox,导入两个组件导入两个。
02:00
组件一个呢是as autox register,第二个呢,我们可以来看一下它是什么,第二个呢,它是咱们这个proxy trans management configuration,比如呢,它会来导入这两个组件,把这两个组件的功能我们大致的分析一下就行了,来可以看一下第一个组件auto proxy register,哎,这个register是什么呢?我们点进去,这register呢,其实就是给我们容器中啊注册being的这些,它是一个什么,Being DeFinition register,它呢会来调这个方法给容器中来注册B应,那注册什么B应呢?我们可以在这看一看,前面呢,都是获取各种类型,哎,他说如果是proxy,他就用这个工具来注册这个啊,而且如果你设置了这个proxy target class。
03:00
啊,会从这个属性中获取它这个pro c target class,就是诶我们这个属性的值,如果它是,但是默认呢,又是false,所以说呢,我们来进这个,我们现在呢,就是proxy,而且它也不等于处,那就我们用这个,它会注册一个点进来,哎,它会注册一个auto prox create自动代理创建器,这个自动代理创建器呢,它来调这个方法,来点进去调这个方法呢,它来注册又调这个方法啊我们点进去这个方法呢,它会来注册一个组件,注册什么组件呢?我们可以看一下这个方法,当时在调的时候,哎,他传了一个叫哎,Infrastructure auto proy correct auto,它给容器中导入一个,给容器中不算是导入,算是注册一个这个。
04:00
组件,其实这个组件啊,我们可以暂时不说,但是呢,注意大家注意下边,下边呢,有一个大家应该熟悉的,这有一个我们往下翻,有一个叫a notation aware SP接autox,诶大家还记得它是什么吗?它是我们当时做AOP的时候,我们可以来回顾回顾,我们当时来在配AOP的时候,我们这个注解也是同样利用这个给容中了一个这个auto相当于这一个模式,如果我们这个事物它导的是这个,这叫呃,基本的咱们这个增强器自动代理创建组件,它是一个什么呢?我们之前a op的话,它是一个后置处理器,而这个呢点。
05:00
过去我们可以来看一看,点过去再来点过去来它也是一个后置处理器,所以说呢,我们就来看它,它的功能,这是我们来分析它的功能就行了,那么这是第一个auto register导入了什么,第二个就是这个pro trans configuration做了什我们给容器中呢,利用它导入这个组件,我们还导入了这个类,那么呢,我们就来挨个分析,我们可以呢,先来分析这个auto register,它导到这个组件做了什么点编过去,诶我们来可以看它,其实呢也简单,基本上呢没做什么,这个auto跟我们以前的not这些也一样,它只是呢利用后置处理器它的作用。
06:00
只是利用后置处理器机制,处理器机制在咱们这个对象,对象创建以后,创建以后,然后呢,包装对象,包装对象然后成一个包装对象,成返回一个代理对象,而代理对象呢,我们以前说a up的时候,代理对象里边有我们的这个增强器,然后接下来代理对象呢,利用什么咱们这个什么拦截气垫,代理对象执行方法,就利用拦截器面代理对象执行方法方法利用拦截器面哎进行进行咱们这个呃,调用这呢,这是我们以前A的时候来说的,那么这个auto。
07:00
也一样,它也是我们可以来看,它在它的这个副类上边来看啊,它在上边呢,它会有一些这些找找各种增强器,找各种增强器,相当于来找增强器包装,而在最前边啊,最前边最前边呢,它这就会有,哎我们来找一找我们这个be创建完成之后,诶这是being完成,哎完成之后,完成之后在这完成之后呢,还是在这包装,所以说这是我们以前一模一样的逻辑,都是来包装对象,我就不用看,那接下来看主要核心来看这个,看这个我们来把它点进去,它又做了什么呢?哎,它其实呢给容器中我们来看啊,它这又是一个配置类,它给容器中呢,利用B注册各种组件,它来注册第一个叫adviser,这个advise呢叫事物增强器。
08:00
我说呢,它会给容器中注册事物增强器,而这个事物增强器,所谓的这个事物增强器是什么呢?这个事物增强器我们可以看啊,它在注册的时候呢啊,它需要一个什么事物属性点过来,事物属性呢,又是一个容器中的鼻音,这个事物属性呢,我们可以点进去,它是用了一个a notation点过来,这个notation呢,调用this代的这些,而且呢,你看啊,这有notation pass注解的解析器,它来解析诶,Spring trans spring的trans解的解析器,包括GPA解的解析器,1B3的解的解器,我们可以点过来,你看啊,这些呢,解析器都来解析这些注解,你看就是解析我们trans里边这些注解的每一个信息,包括它每一个属性,Row bank for啊,No back。
09:00
不错。这些back for no back for,就是我们在喘塞脑里边来能写的这些属性,所以说呢,它第一个给容器中注册事物增强器,这个事物增强器呢,事物增强器要用要用注解信息要用要用事事物注解的信息哪个方法是事物,包括它的这个事物注解是怎么整的,所以说呢,我们这儿会用这个事物属性,它成了一个叫a notation,它来解析事物注解,哎,各司其职,那么接下来呢,我们再来看还做了什么。啊,我们来到这儿给容器中注册一个事物的这个增强器,这个增强器呢,除过要事物注解信息,它还要一个叫trans intercept,叫事物的拦截器,好,然后呢,它还给容器中第一个是注册增强器,增强器呢要两个,一个是咱们这个事物注解信息,第二个呢,是咱们这个,我们叫事物拦截器,这个拦截器呢,它给这里边,我们可以看一看,它给这里边,它给这里边,哎就在这,他给这里边呢,创建了一个叫intercept。
10:34
这是做什么的呢?诶,他把这个事物属性放在这,包括呢,诶他把这个事物管理器trans manager,把trans manager也保存起来,就是呢,我们这个拦截器里边保存了事物的属性,保存吧,事物啊属性信息信息包括呢,还有咱们这个啊事物管理器啊都保存了这些内容,而这个trans生intercept是什么呢?我可以点过去给大家看点,诶我们来看啊,它有一个叫什么cept,这是我们a op里边之前说过的,我们a op里边呢,我们四个通知方法都最终被整成增强器,增强器呢变为我们这些man的intercept所说底层还是呢,哎,它是一个man的intercept叫。
11:35
方法拦截器,什么叫方法拦截器呢?也就说我们现在呢,给容器中会放一个代理对象,代理对象要执行目标方法了,方法拦截器就会进行工作,怎么工作我们来看,哎,我们这是一个叫trans intercept,我们点过来,来看它这个拦截器怎么工作。啊往下翻,诶in work这呢有in work with trans塞ion,哎我们使,哎我们点进去,它就利用事物进行工作,怎么工作呢?先来获取到事物的一些属性,再来获取trans manager,所以说呢,我们这个它在在目标方法执行的时候,其实跟我们之前L的原理一模一样,在目标方法执行的时候,因为它是代理对象在执行,然后代理对象呢,会来执行我们这个拦截气垫,拦截气垫就是它,所以说呢,目标方法执行的时候,执行我们这些拦截器垫,而这个拦截器量呢,只有一个叫trans intercept是我们这个事物拦截器,这个事物拦截器它的这个作用,事物拦截器它的这个它的这个功能,我们点过来,你看它执行先来获取咱们这个事物,先获取咱们这个事物。
12:57
事物相关的属性,然后呢,我们再来,我们看来看它再来干什么,我们trans in thecept,好,Welcome with它我们把其他的关掉,它先获取事物属性,再来获取trans manager,哎,这个trans session manager我们可以在这说一下,诶我们在配置这它是第一步,先来获取事物属性啊,再获取获取,再获取我们叫manager获取平台的事物管理器,好这个获取trans塞manager怎么获取呢?我们之前给容器中放了一个,我们可以看它怎么获取点过来啊,它是怎么获取呢啊,他说如果我们这个事物属性里边有考far这个注解,要说呢,这个注解并且有值,它就直接呢。
13:57
从容其中按照这个指定的值来获取,这是什么呢?其实就是意思这个transitional这一块呢,我们明确的能指定这个喘三声manager,它就是跟等同于我们这个college far的这个玩意啊,就说呢,你指定事物管理器的名字,这是来能指定的,而我们一般呢,都不指定。
14:19
那不指定的话呢,我们就应该是来到这儿,哎,它来判断我们这个传三声manage,如果有名也就是这么来获取,但是呢,我们都没指定,没指定的话呢,它来获取默认的,默认这是我们给它自动装配进去的,这个呢没有值,所以说一旦获取没有值,它呢,呃,我们来看啊,来看最后一步就行了,它是从IOC容器中按照类型获取的,所以说我们只需要给容器中加一个manager,它就获取到了,获取到以后呢,就能直接用了,哎要说它会最终,哎最终呢,最终最终如果事先没有,如果事先事先事先没有,哎添加指定任何trans manager trans manager,那么呢,他最终会从会从咱们。
15:19
叫容器中,会从容器中按照类型获取一个,获取一个,严格来说是获取一个叫plant,所以说呢,我们在LC容器中,我们这么来注册它是可以用的,那么接下来我们来看它第三步,它要干什么,比就说呢,我们来看它第三步的执行,第三步的执行,哎,我们来找到它的这个invo,好,Invo with transition,它来获取到事物管理器,然后呢,他来得到我们要执行的这些事物方法等等等等,诶我们来看啊,它呢在这开始就是我们这些事物方法,它来proceed with开始相当于事物方法执行,如果执行哎,大家可以点过去,这一块呢,就是利用方法,我们之前的那些。
16:19
的啊invocation这些是怎么执行的,整个机制是一样的,那么主要来看啊这一块,它这呢是先有一个创建喘塞式,如果是必须的话,如果我们是一个事物,那我们就来在这儿开启事物,你看啊事物如果出现异常,它在这异常呢,它这叫complete after容它是怎么做呢?点过去你看啊这块事物呢,它是拿到事物管理器进行回滚,所以说呢,我们这个方法在执行的时候,哎,方法先来执行,执行目标方法来,如果异常,如果异常获取到事物管理器管理器,然后呢,利用事物管理器回滚,利用事物管理器回滚这次操作。
17:17
回滚操作,比如说呢,真正的回滚与提交是事务管理器来做的,而我们这个intercept只是来拦截目标,方法我们可以来看好,也就说呢,这是我们这个回顾,但是如如果是一切正常的,我们来看啊,这是方法的执行,如果一切正常,我们还能拿到返回值,哎,这有一个commit after点过去还是一样拿到事物管理器提交事物,所以说他这样就把事物给加上,如果正常正常,然后呢,利用事物管理器,利用事物管理器提交实物,这就是呢,我们整个事物控制,我们通过简单的来分析源码,我也不用走了,整个流程呢,跟a op一模一样,首先用这个register给我们这里边注册一个后置处理器,然后这个后置处理器呢,负责给我们包装代理对象,再。
18:17
当注册一个这个配置,这个配置里边呢,会有我们这些拦截器,包括呢,事物增强器等等所有的信息,我们代理对象执行目标方法就会执行到我们当前啊容器里边的这个拦截器的这个拦截气垫,每次执行呢,如果异常了,利用事物管理器回滚,如果正常了提交,这就是我们这整个事物控制的原理解释,大家下边呢,可以按照我们这个流程走一遍编码。
我来说两句