00:00
接下来我们说解决double无法发布被事务代理的service问题,首先来看我们之前写的案例,在这块呢,我们提供了两个应用,一个呢服务提供者,一个呢是服务的消费者,都没有问题,回到我们的idea当中来看一下。这个在我们的服务提供方这一块呢。在我们的这块啊,如果说是加上我们的事物的话,我们的a transactional。那如果此时我们在我们的呃,实现类当中啊,加上我们的transactional,加上我们的事物。加上事物以后,我准备这边啊,准备了,首先我们还得加引入一些依赖。回到我们的POM依赖文件。然后在我们的。Dependency这块啊,加入一个是我们的连接my circle的MYSQL连接我们Java的一个驱动,还有一个我们德鲁伊的一个连接池啊,包括我们spring my这块呢,我们刷新一下。
01:11
然后呢,在我们的application context当中在加入一些配置,首先第一个加的是我们的关于数据源的,然后是我们的事物控制的,这个之前大家都应该配过啊,这这块就不说了,那刚才我们在浏览器当中,在这块我们通过啊,我们刷新我们是可以看到我们这块的服务。是由提供者,消费者是没有问题的,如果我们加了事物以后来看。我们先把我们的服务。首先先给他停掉。我们停掉所有。然后在这块呢,停掉我们的服务端。服务提供者。这个是我们的服务提供者,然后我们停掉,停掉以后呢,我们再来启动。
02:05
呃,在这儿。好,启动成功,成功以后呢,我们来看一下我们的浏览器。好,那么启动成功以后呢,来访问我们的浏览器,这个呢,是我们之前正常访问出来的,没有问题,然后此时呢,我们再刷新。可以看到现在已经报了500,已经出了问题,然后呢,回到我们的。管控台在这一块呢,我们看我们的来刷新一下。发现我们没有提供者,我们的消费端呢,这块也提示没有提供者,那这个是什么问题呢?这个原因啊,是我们的事物的底层原理啊,它是为我们的服务提供提供者的这个类啊,创建了代理对象,我们正常spring a op提供两种代理东西,呃,代理对象一种是我们的GDK,另一种呢是我们的cg lib,那么默认情况下呢,我们spring是基于我们的JDK动态代理的方式创建代理对象的。
03:24
而此时我们加了at transactional以后呢,来看一下我们idea,他此时代理对象的完整类名为就是我们的叫这块我们叫com点我们的点proxy。然后呢,后边是一个Dollar,然后proxy后边呢是一个数字啊,这个数字呃,不能写叉叉点点,这个数字是随随机的,从而呢就导致我们当在发布服务前进行包匹配的时候,没有办法进行匹配,从而呢就没有创建我们的服务提供者。
04:01
接下来呢,我们。来看一下我们在我们的application啊,Contact servicer当中,我们被发布为服务的啊,必须是这个包是吧?Com,点这个野马哥点service.imp在这个包下才它才会被我们发布为服务。那接下来呢,我们通过断点调试的方式查看一下我们double执行的一个过程,在这块呢,我们CTRLN有一个叫not。No。Ta。呃,Ta并。啊,这块多了一个T。注解的一个并对象在这一块呢,我们看到啊,它有一个方法。叫我们的is match package是否匹配这个包,在这一块呢,我们给它打一个断点,然后呢,来看一下它这块呢,是说我们类似点,我们的notation package就是我们当前对象它的注解的包,如果不为空啊,并且呢,当前注解的这个包它长度不等于零。
05:14
就会走这一段逻辑。返回一个处,返回处的意思就是向我们的呃主当中啊进行注册。然后呢,接下来我们先把我们的服务端嗯停掉,这个是我们的服务端停掉,然后通过我们debug的方式来看一下。好,启动。好,来看,启动成功以后,我们来看,这是我们的double,我们的provider DEMO,这就是我们容器当中的第一个对象。
06:08
呃,就是我们的这个。然后呢,再往下。回到我们这个。断点这块F9。F9再往下。这个也不是F9。这个registry呢,这个呢,是我们的第二个来看一下。诶,我们的啊这块。这个呢是我们的第二个,第三个呢,是我们的not来往下走。接到了我们的transactional。事物控制这一块往下。
07:00
好在这这块呢,我们来看一下。我们的。This b这块就看到他用了一个代理,这个代理呢是就是我们GDK的一个代理。我们往下走,然后呢,再往下走。来看我们代理完以后,我们的这个包名就变成了com,点上点proxy。那这样的话呢,就导致我们double在进行包匹配的时候没有成功。啊,因为我们在呃,发布服务的时候,它的扫描的这个包啊,是我们。在在我们的这一块,我们扫描的包是我们的。这个啊,Package是这个com点野马哥下的service.ip我们扫描的是这个包,但是变最后呢,变成代理以后呢,变成了我们的com点上点proxy,导致我们没有后面的代码,真正的发布服务的这个代码没有进行执行,那么我们怎么来解决这个问题呢?其实很简单,我们只需要在我们的开启事务这一块。
08:14
啊,默认是我们的GDK,我们在这一块呢,我们的加一个proxy target点杠class,然后给它设置为为,这样的话呢,使用的就是我们CGB的代理,同时呢,在我们的实现类当中,这个在我们的service啊注解下加一个我们的interface。Class interface class加逗号interface class这个的作用呢,是指定我们服务的接口类型是我们的service hello service,点我们的class啊这样子就可以了。然后呢,我们。来再看一下,把这个取消掉,然后呢,停掉我们的。
09:01
服务这块我们先给他放行放过去。好,然后呢,在这块停停掉我们的。服务提供。然后再来启动。注意我们改的地方啊,就是将我们的事物这一块啊,A op的默认的这个代理方式,A op的默认代理方式改为cg lab,然后呢,在我们的实现类当中指定我们的服务接口。为我们的hello service,如果这块不指定的话,还是用的我们它的这个服务接口还是我们的的proxy。好,那么启动完成以后呢,我们来刷新我们的这个页面,刷新,然后进入我们的。
10:03
服治理服务。这是我们的提供者,这个时候呢,就能看到啊,我们就可以正确的来创建我们的服务提供者,我们的消费者呢,服务消费者也是没有问题的。那打开网,打开网页,访问我们之前的这个地址。来看也是正确的刷新我们只有一个,那这个呢,是我我们关于double啊,解决我们double无法发布被那个事物代理的问题。
我来说两句