粉丝7406获赞3.6万

supreme 是如何整合买 babys 管理 mop 接口的?那这道面试题呢,也是出自于阿里的一道面试真题,主要呢用来考核一下你对 supreme 的一些拓展是不是掌握好了。 我们都知道啊,买 babys 的这个 mop 接口呢,它是没有实心类的对不对?那么我们是如何能够在我们的这个,比如说我们的业务逻辑类里面进行自动注入 mop 接口,为什么可以做到呢? 对了,本视频的文档我已经整理好了,并且与往期内容一起汇总成了二零二三年最新加法面试文档,放在了视频的最后面,坚持看完一定对你有帮助。那很多同学都知道,其实 mob 的接口呢? 买 base 它的实线是什么呀?动态代理对吧? j d k 的动态代理,这个慢慢儿接口的一个核心实线是 j d k 的动态代理,因为 map 他是一个借口,你肯定不能说我直接调用他的一个方法就去操作入库。所以说买 babys 呢,是利用 j d k 的一个动态代理来去实现的这个 map 借口。 但是关键是 spring 又是怎么管理的这个 mobile 接口呢?又是怎么管理的这个 jdk 的动态带对象呢? 所以说你必须对 supreme 的这些困难点非常熟悉,那么你才知道,我们就来说一下,好吧,当然这个知识点啊,徐老师之前也讲过一节专门的公开课, 咱们有兴趣呢,可以找一下 up 主,或者说找一下我的助理老师,单独的去要一下 supreme 整合 my base 的一个原理。当然我在这里呢,就把那些关键的点给我们说一下,好吧,首先我们刚刚说了 my base mover 接口呢,它的核 型是 jdk 的动态代理,其次呢,我们要知道啊, three 他肯定是管理了这个 mob 接口的动态代理对不对?否则你是不能自动注入进来的呀。 那么 supreme 它是怎么管理进来的呢?我们要知道啊,当我们 supreme 内部去注册一个病的时候,去创造一创建一个病的时候,那首先会将它注册成病体分离审, 对不对?那么注册 beautification 的时候呢,它就是去扫描你所有的这些类,然后呢,发现你上面有个恐 pod 的注解,就会把你呢 视为是一个有效的组件,然后呢判断你是不是一个接口,或者是不是一个抽象,如果是的话,会把你给排除掉。所以说 spring 它内置的这种扫描注册 beautiful nation 的方 是呢,是不会去注册你的接口的,也就是说他会把你的接口给排除掉,这是他默认的这种注册病例分离审的方式。所以说既然你 spring 你内部没有办法去注册接口的话,我只能怎么样?我只能我自己通过某个扩展接口 去注册 indefination。 那么哪个扩展接口可以注册 indefination 呢?其实我们之前就已经讲过,对吧?有一个叫做 indefination registry post process, 这个扩展接口呢,它又可以去动态的注册 indefination, 因为他提供了一个注册器,我们看一下,也就说你只需要实现这个扩展接口,那么实现这个方法呢,他就提供了一个这个注册器,这 这个注册器呢,就可以动态的注册并 definition, 知道吧?但是虽然现在你可以自己去注册, 但是你不可能说我手动一个一个去注册吧,对不对?你不可能说,比如说我有一百个 mop, 你不可能手动的去调用这个 redressed, 并且分内容去手动注册一百次吧。 所以说呢,你还是得去利用 supreme 的这个扫描类去给我们解析 component 的这个能力。 所以说呢,你可以呢去重写一个这个扫描器的一个子类,你去继承 supreme 内置的这个扫描器好吧, supreme 它内部呢有一个这个扫描器负责呢啊, 他是负责扫描我们所有的 lay, 其实就是我刚刚那个图里面说的啊,刚刚这个图里面说的他呢,其实就是负责拿到你所有的点 class 文件,然后呢判断你上面是不是恐怖的的,是不是抽象,如果是的话,他就会帮你去注册并基本历史。 所以呢,我们不可能说我自己还去完全的实现这一块,对不对?那工作量就大了。所以说呢,既然 supreme 它已经实现了,那我们就可以拿过来,但是你拿过来的话,它会排除掉接口呀,那么我们就可以呢创建一个子类,对不对?我们去实现它, 实现它这个副类,就是将这个 skin 呢作为副类,我们就实现它,然后重写它排除 接口的这个方法,其实就是这个方法好吧, is candidate 孔 bonut 这个方法呢,就是用来排除接口的,嗯,就是这个好吧,重写这个排除方法, 那么我们呢就可以将接口给它注册进来了,但是虽然接口注册进来了,但是无法去给它实力化并啊,因为你要知道,哪怕我为你把这个接口的 indefination 注册进来了, 你也不能够在病的创建过程当中呢,将这个接口进行实力化,对不对?那么又应该怎么做呢?这个时候呢,我们就可以呢去修改它的病 definition, 对吧?去修改它的病 definition 当中的这个并 class, 然后呢这一步我们管它叫做偷天换日,之前如果你不改的话,之前 indefination 的这个并 class 呢?它是一个接口,对吧?那么接口它是不能实力化的,那么你把它改成一个能实力化的不就完了吗? 关键是我们改成哪一个对不对?因为我们要知道买 babys 的这个 mopper 接口,它是动态代理啊, 那么你给它改成哪一个并 class, 你可以为它创建动能代理呢?其实利用这个 factory 并 就可以。这个病呢,我们之前说过他是一个特殊的病,他可以通过这个 get object 的呢,我们就可以在里面自由的去控制这个病的实力化过程,就可以在这个 get object 方法当中去创建 j, d, k 的动态代理。 能不能明白?所以说几个关键点,记住这四个关键点就完了。好吧,所以说我们需要呢在这里改掉并 definition 的并 class, 把它改成 factory 并, 然后呢你就可以在 get off jack 里面呢去控制他的动态代理的创建,从而呢去管理所有的 mob 接口。 ok, 记住这几个关键点就行了。首先呢,我们需要自己去注册,然后呢需要自定义一个实现了他内置的这个扫描器的一个子类,为什么呀?因为我们不可能自己去实现整个扫描,这个 扫描这个 indiffection 的整个的这些代码自己实现的话,工作量太大了,对不对?那么我们只需要实现它内部的 去,去继承他内部的,然后重写他的排出接口的方法就够了,那么工作量就减少了,对不对?然后呢?虽然注册进来了,但是他不能实地化,那么这个时候就需要偷天换日改掉他的并 class 改成 factory 并,然后再 get off gear 的当中呢,就可以去创建 gdk 的动态代理了。 ok, 那如果你没有看过原码的话,肯定听起来有点坐飞机对不对?因为你要知道我两节课的一个知识点,我压缩成十来分钟就就给你讲完了,那肯定是有点晕的对不对?那你跟面试官你也不可能弄,你也不可能说我十来分钟跟你讲对吧?你最多讲个四五分钟 对吧?甚至一两分钟就就讲完就够了,对不对?所以说把这些关键点说完就行了啊。那么在讲面试题的时候,我不可能说详细的去 给你讲他的这个过程,好吧,需要详细学习这一块内容的,去拿到徐树老师之前讲的这节公开课, ok, 那么这个面试题呢?就给他们讲到这, nice。

今天咱们学习一下如何在 id 二里面创建一个固体项目,并且集成买半提子框架,打开 id 二创建项目,选择 splan 初始化选项,设置项目名称, 设置包结构,设置 gdk 版本,添加外部支持,完成,这样一个简单的布的框架就创建完成了。接下来咱们创建一个 添加啃,除了注解 添加方法,添加防腐剂, 京东项目 好方案成功,接下来咱们添加文案就是依赖啊, 添加美白配丝启动包, 今天买这个驱动宝, 咱们从上一个项目中把 iphone 的 marple 文件考过来, 拷贝满盘文件, 好改成咱们当前项目的路径, 添加慢幅溶解 啊,走啊。 然后配置配置文件,首先配置数据库,连接 三三零六, 接下来咱们配置美白铁 加在满盆的配置 welplok。 接下来咱们试着启动一下啊,看能不能获取到数据, 好突出成功。


好在之前呢给大家讲了多数据源的两种切换方式,一种呢基于这种 mybatis 插件,比较适用于读写分离的数据源场景,那这种方式呢,一劳永逸对吧?我们只需要创建一次插件,然后给他指定不同的数据源就可以了。 还有一种方式呢,就是基于 aop 加自定义注解,那这种方式呢,我们需要呢去声明自定义注解,然后在不同的业务方法上面呢,或者说业务类上面呢,去使用注解给他指定数据啊,对吧?然后呢还得使用切面来进行切换我们的数据啊。 那有同学就在想啊,老师,这种方式好像太麻烦了对不对?我每次去创建一个业务方法,我可能都需要去指定这个注解,而且呢也比较容易出错,对不对?那有没有更简单的方式呢?那徐福老师今天就来给大家讲一种更简单的方式,好吧,也就是 一个 spring 应用呢,我们去集成多个买 base 框架,那这种方式呢,可以说是最简单的一种多数。说句多数据源的实现方式,为了本视频的文档我已经整理好了,并且与往期内容一起会放在了视频的最后面,截止看完一定对你有帮助,因为他根本就不存在数据源的切换, 你都不需要使用我们之前讲的这个 abstract routing datasos 了。好吧,那这种方式呢,完全就是你一个 spring 应用给他去配置集成两份那个 my betice 就可以了。那怎么去给他集成两份呢?很简单,说白了,你以前你是怎么集成 my betice 的?你现在呢, 就给它集成两份就完了,你以前不是要配置一个 circusation fact fact, circusation factor bin 嘛,对不对?那么你现在呢,就给他配置两个,那每一个 circusciction factor bin 呢?你都给他去指定对应的这个 mo per 接口,能明白,然后指定对应的这个 marper x mail 配置所在的这个路径。然后呢给它指定对应的数据啊, 对应的数据源呢?去读取对应的这个与数据源链接地址。那么这样的话,假如说我们此时去执行一个写的操作,那么此时他就可以拿到写对应的这个 map 接口,那么对应的 map 接口呢?他就会使用对应的数据啊, 然后执行数据库操作。那么这种方式呢,完全就不需要去切换我们的这个数据源了,因为你对应的这个 mop 接口,他会使用对应的数据源,能明白吧? 来,我们接下来呢,就来实现一下这种方式。好吧,打开我们的项目,那我就不在之前的这个项目当中去写了,好吧, 等一下显得好混乱,我们新建一个项目出来,那之前呢,很多同学表示,老师你没有带着我去新建这个模块,我有点不会,那我就带着你们来新建一下,好吧,那这里呢,我取个名字叫,嗯,买 带。呃, dynamic 买 babys 吧,好吧,就叫这个名字。然后呢,我们的 group com 点图铃,点 data sauce at five 的我们不改,然后 package 我们就带那个 mac 点 my bets, 那么这样我们选择八版本 next, 那在这里呢,我们就选择 web, 因为我们待会呢要基于 web 来进行测试不同的这个数据源。然后呢,我们再来选择 longbook, 好吧,为了节省我们的 get seat, 以及呢,我们需要使用这个 o m 框架买 betice, 对吧?那 my cycle 的数据源我们肯定是要的,以及呢,还有买 betice。 那么新版本的这个 idea 啊, 呃,或者说是应该是算是这个 supreme 的这个初始花香岛在新版本当中呢,他加了买 batice 这个框架,以前是没有的,以前呢,需要我们自己去添加这个破木依赖,现在呢,直接可以勾选了。 看来他已经认识到了买贝利斯重要性。好吧,来,那其他的应该就没有了。德鲁伊的,德鲁伊的这个连接词我们可以搜一下 注意的德德鲁伊的链接池,他没有。我们待会呢,自己来添加。 ok, finish。 好的,那么 现在呢,我们就已经创建好了一个模块,我们把之前很多的一些代码给他复制过来,好吧,包括哪些呢?包括这些。呃, n t t。 啊,还有这些 service 啊,我们给他复制过来。好吧, 还有这个 service。 那么此时呢,我们还没有这个 mopper 接口。我们先把里面的, 先把这里的这代码呢,我们先给他先给他注视掉吧。好吧,先把它都去掉吧,待会我们写的时候再加。那这里的这些包路径我们得给他换掉啊, 都给它去掉。 ok, 那接下来呢,我们来添加这个数据源的配置,把这一份数据源全给他拷过去, 我们依然用这个 yama 文件吧,因为之前用的是 yama, 对吧? ok, 好,接下来呢,我们就来给他创建 配置文件 config。 我们呢,给它创建两份这个 my bilis 的配置。好吧, my bilis 的,呃, red w config w 放在前面吧。 w 的 my bilis config, 然后呢,再创建一个 read my belief coffee。 好吧,我们依然用之前的这个。呃,那两个数据员,好吧,我就不再新建了。那当然啊,如果你你的是那种多业务数据员的话,那你肯定有几个,你就创建几个,能明白? 来,我们给它设置为 configuration, 那这个也是一样的,我们先配置一个吧。好吧,那么待会儿另外一个呢,我们就直接复制就完了,我们先来给它编写这个 w my bets, 也就是基于写的好不好写数据啊配置。 那么同样呢,我们需要呢,首先配置一个 datasos, 我们把对应的这个 datasos 呢给它复制过来。 咱们这里德鲁一的这个易拉 在呢,我们给他复制一下。好吧,因为这里我们还没有添加德鲁一的这个连接词,我们需要给他复制过来, 然后呢,下载一下依赖, ok, 我们稍等一下。好的,那么此时我们就已经配置好了这个 datasose 一,那么我们再来配置一个 cycle season factory。 我直我直接复制一下我的笔记吧。好吧,我相信这个集成。买呗,这个代码大家应该也都写过,我就没有必要再花费时间再去每一个都写了。好吧,免得我待会出错了,还要花花时间呢去解决这些配置的代码呢,说实话也很少去写,对不对? 来,那在这里呢,我们配了一个 w 的 secrecation factory, 以及呢,我们把这个 data source 一 给它注入进来,在这里呢,我们指定需要给它注入的是哪个 datasos 一,或者说你不需要这样去写也可以啊,你也可以呢,直接去调用这个 datasose 的方法也是可以的,在这里这样写也是新的,好吧, 那在这里呢,无非就是我们去给他 new 了一个 cycle section factor bin, 当然我这里呢,需要给他设设置 cycle section factory 和 cycle cycle section factor bin 都是可以的,好吧, 那当然,如果你使用的是 spring boot 啊,你配置的就是 cycle season factory, 因为 spring boot 它自动配置类当中需要用到。 然后呢,嗯,我们来看一下啊,在这里呢,我们就指定你要扫描的是哪个 marper xml 英式文件。那我刚刚说了,你需要配置两份集成码,两份买 bilis, 那 那么对应的不管是 mobile 接口还是 mobile xm 文件,你都要给他指定不同的路径啊,不同的数据啊,你都要给他分开来,比如说你按照业务去区分 order, 对吧? user, 那么你就给他呢对应的给他区分开来就行了, 那么在这里我们这个日志的就给他关去掉,好吧,所以说我们在这里说白了就是指定了数据员,指定了这个写的好吧,就或者说主主库,好吧, 然后呢,这里呢,指定主库对应的 marper xm 文件,当然如果没有的话,你也可以不用指定,对吧,或者说你是基于注解方式来实现的,那么你就这一句,也可以不用配置,好吧, 然后呢,我们还需要呢,去使用这种 draw config 的方式呢,去集成买 base, 非常关键的 一个注解是 marper scanner, 那在这里呢,我们就需要去通过 base package 给它指定我们所在的那个 marper marper 接口的包在哪里,那我们给它复制一下,好吧,复制一份过来, 那么当然在这里啊,我们需要用两份,好吧,那我们呢就先先把这个错误先给给他解决一下,那我们这里呢就再新建一个 w 的包,新建一个就是从库的包好不好?在主库和从库的包,那么这个呢,我们就放在主库里面, 那么我们再复制一个一模一样的,因为我们都只有一张表,对不对?当然你不同的业务数据库肯定会有不同的这个表,那么这个 map 名字肯定也不一样。我这里因为我为了方便,好吧,就一直 呢就只用一张表,这个希望大家能够理解这一点啊。然后呢我们顺便呢可以改个名字,待会呢更容易区分,好吧,这个我们就叫 ah friend mapper, 那下面这个呢,我们就叫 w freedom upper, ok, 那里面的这些基于注解的买 benice 事件我们就不改了,依然让它维持原样,好吧, 那在这里呢,我们就需要去指定我们的 w 主库的这个 map 接口,给它复制一下它的完整类路径。 然后呢还有一个非常关键的东西啊,那么买 beatles 去操作数据库的话,它需要用到这个 cycle station factory, 那如果你配置了多份 cycle station factory, 因为我们待会也要在这里配置一份嘛,对不对? 那么他底层就不知道要注入哪一个了。当然我们在这里呢使用了 primary, 就是他会使用这个,对吧?也就是如果他根据 cycle, cycle, cycle cell 找到了两个,他就会优先使用这个。但是你到时候你的这个存库,我们的这个 r 开头的,他也会使用 这个 sex section figure, 那么就会使用同一个数据员了,那这样肯定不行,对不对?所以说这里呢,需要用到一个非常关键的属性,通过这个属性呢,你就可以指定当前的这个 sequel section factory 是哪一个,也就是通过它来进行指定。好吧, 通过这个 cycle section factory r, e, f 去指定你需要引用的这个 cycle section factory 的病的名字,它是什么? ok, 哎,我给大家写一下注释吧,这里呢去集成我们的 my babies, 那么这里呢,主要做两件事,第一件事呢,去指定我们需要扫描的 map 接口包,当然这里呢是我们的主库,对吧?然后呢,同样的需要呢,给他指定你使用的 psychosinger factory 是哪一个?那么这里呢,同样的是我们主库对应的 psychosinger factory, 那么这样呢,我们就为主库配置了一个集成的一个买贝利斯。那么接下来呢,我们只需要相应的给存库呢,给他配置一下就可以了, 那么这些我就都复制一下,当然这些呢,我们都要改一下,改成对应的 r, 对不对?那么此时呢,他就会扫描这个 r 里面的 mop 接口了,那么当然这个类名我也改一下,然后这个就是 datasos 二, 那么这个病的名字我们也改成 dangerous 二,那么这个方法引用我们也改成 dangerous 二,然后这个 sexy investor 呢,我们改成 r, 把它重复的 sexy in factory, 那这里的引用呢,我们相应的也要改一下。 呃,那你对应的,如果你通过这个 marper xmail 文件去实现的这种 circle, 你就用对应的。好吧,那这里我因为我们注视掉了嘛,我也改一下吧。 ok, 那我们就给他集成了两份 my bad list, 那接下来呢,我们就只需要去操作对应的这个数据栏的 motor 接口就可以了。来,我再来给他添加 ctrl 了, 那么我们这里呢?去,我把这些导入包的异常给他去掉,让他重新导一遍。 ok, 那由于我们刚刚的把这个方法给他去掉了,我们再复制一下过来,好吧, 复制到我们的 service 的接口里面去。 ok, 那此时呢,我们就来到这个实线类当中呢,去实现这两个方法。 那这这里的方法呢?你就不同的这个业务方法,去调用不同的这个 mark 接口就行了。就比如说我们这个读的操作,我们就调那个读的库,对吧?这是读,我们就要调那个读的库,或者我们叫做从库也可以。好吧,那这个呢?是写,那么我们就要调用写的库, 那分别对应这两个 map, 那我们就把这两个 map 呢,给它自动注入进来,其实非常的简 当,对不对? 我们加上 out y 的,然后呢,还有一个 write 的。 ok, 好,那么读的我们就调读对应的 mop 接口,那么写的呢?我们调写对应的 mop 接口就完了,就这么简单。 ok, 那我们就来启动一下,好吧,那这里呢,我改个端口吧,之前 so sover 点 port, 我们改成八零八幺,好吧,之前都是八零八零, 接下来我们就可以启动了,是不是非常简单啊,对不对?完全就是可以说无脑了啊,没有之前这么复杂,你还得去理解买 base 的这个。呃,数据库操作底层原理,你才能知道怎么去扩展,对不对?那现在呢?我完全就是给他 说白了就集成两个买 base 就行了,对吧?你以前知道怎么集成买 base, 那现在还给他加两份,对不对?无非呢,就可能之前不要指定这个属性,可能就是这个区别而已,对不对?然后呢,不同的这个库呢?给他指定不同的对应的资源就行了。 好,我们启动完成。那接下来呢,我们来演示一下 local house 八零八幺,然后是 friend select, ok, 哎,这个是中文,那说明什么啊?我们看一下,因为我之前课前呢做了一些操作,他不一定就是因为我之前呢插了一些数据啊,把我这里改成英文啊。 ok, 来,我们再来,对吧?说明没有问题啊,依然呢是我们的这个从库,也就是我们 我们读的那个数据库。 ok, 那接下来呢,我把这些数据都给他删掉。好吧,那接下来我们来演示一下这个, 哎,没有删掉吗?我们来演示一下这个保存,也就是他就会使用我们的主库啊,这是音色的,对吧? 他就会使用我们的主库了,刷新,对吧?那数据就进来了,非常的简单啊,完全可以,就是五秒,对不对? ok, 那徐老师呢,给大家讲了两种多数卷的使用方式。好吧,那你使用基于这种 abstract roting datasos 的方式呢,你就要去进行切换了, 好吧,因为你需要呢,不同的场景给他指定不同的这个 datasos, 所以说这种方式你需要我们手动的去给他切换。那切换方式呢?讲了两种好吧,但是这两种方式可能,呃 呃,有同学觉得,呃不尽人意,对吧?不如人意。那这种方式买杯,这个 string 集成多个买杯的框架,这种方式呢,可以说是最简单的多数选实现方式了,对吧?但是他需要加载的东西,他需要加载的这个,呃,对象可能占用内存呢,就会多一点,因为 这个 cycle season factoring 它其实是一个比较,嗯,重量级的一个对象,所以说它可能会占到你的内存呢,会比较多。但是没有关系啊,它只是在我们启动的时候呢,会去使用。好吧,呃,启动完了之后呢,基本上就不会有什么影响了。 好,那接下来我们就来讲一下怎么对这个读书卷进行事物控制。 nice。

哈喽,大家好,我们上期聊到 spend data、 gpa 与 maris 的区别。其实对于这两种框架,国人与老外的态度有很多不同的。 个人喜欢买不利斯的原因如下,一、大厂带节奏,国内做互联网的加二程序很多都是拷贝阿里的,阿里一开始用力 ibdis, 大量的老系统都是基于 ipdis 和 midis 的,市场上对于 midis 熟悉的人才更多。 第二,简单学习成本比较低。三、对于复杂性需求的灵活性高。国内系统普遍都是分布式, 流量和性能决定了需要经常进行优化,而适用 maplets 对复杂需求的优化很方便。四、 happy 的学习成本高。虽然实际上 supreme d 大级别 是非常简单的,但后期调试跟踪问题很麻烦,改起来也很麻烦。老外喜欢 gpa 的原因有这么几点,第一,很多老外对买不类似的认知还停留在 ibax 阶段。第二,喜欢 oop ddd, 他们认为写字符不优雅。使用 gpa 的核心是让我们关注对象建模,而不是关心底层数据库是映射。三、有些老外在技术选型时不会考虑出 string 这种知名框架以外的其他技术, string 确实很强,国外一个项目做了几年十几年都是很正常的。 第四,数据体量和种类没有达到,还有什么其他问题,欢迎大家留言讨论,我们一起学习进步,我们之前搞得到吧。


死盆对着 gpa 未来会不会取代买 batis 啊?就是这么告诉你这个技术的发展哈,你可能还没有搞清楚这个事。对于 o r m 持久层框架,开始啊,我们就不不往前倒了, harmon 那个时代吧, harmon 呢,它就是 o r m 对象关系映射,它就可以不用写代码给你自动设计师 c 口。然后后来呢, spring 呢,就出了一个 spring data gpa 类似的 o r m 的这种组件吧,它其实呢,就统一了,类似于 happiness 呀等等哈,这些不同的规范 都是可以不写代码。但是呢,这样做完了之后呢,发现啊,不太适用于对应的互联网这种项目模型, 因为互联网下边呢,其实这种 circle 啊,对于这种快捷啊要求还是比较高的,对于这些深深的 circle 呢,的一个优化可能比较不太方便,所以呢,那个时候买 bids 才大行其道。对,他是这么一个关系啊,不是说取不取代的问题,他一定是有他的适用场景。对,就是他引 隐藏了 circle, 就相当于你没办法对 circle 进行控制了,那凡是你需要直接去控制 circle 的场景,他就不适应。所以我感觉哈,买 babys 其实更加适合于互联网产品的项目。对,然后呢, sprint, gp, tablenet 这种类似的不显 circle 的框架吧,他可能更加适用于一些传统行业的项目。