粉丝571获赞2820

adiomen 依赖分析工具,这里有一个视力代码是操作 excel 的工程,引入了阿帕奇的 pua 和阿里巴巴的 ecexl 两个依赖文件。呃,我们运行工程可以发现汇报一个 no class deform 内找不到的一个异常,然后这里主要是因为驾包冲突了,导致,这样会找不到 类的错误。我们可以看到阿里巴巴一 z 一个要导入的是二点二点八,其中他引入的驾包我们可以分析一下,然后选点开 maven, 选择右键点 analyze dependencies 分析依赖。然后我们在这边可以看到 这有几个黄色的感叹号,表示有冲突的,我们下滑。可以发现 pua 三点一点一,零点一是有冲突的。 eceasel 中它使用了更高的三点一七版本,而我们引入的 pua 是 三点一零点一版本,根据最短路径原则会优先导入三点一零点一这个版本, 所以三在三点一零点一中,我们需要的类没有被引路进来,所以 ezx 要汇报,这样找不到一个类的错误,我们可以看 看到,在这边我们可以点击直接显示有冲突的类,可以看到这边,嗯,但是艾利亚自带的这个依赖分析工具没有这个直接 exclude 排除掉这个异常, 嗯,然后我们有一个插件可以帮助我们更好的去处理这个异常,他是 插件,我们可以在哈利根词的应用市场中打开。这边已经安装了 melvin kipper, 嗯,安装之后呢,我们可以看到在这个破木文件底下,这边就是,呃破木文件对应的 声明,然后这边有一个依赖的分析,这就是插件慢慢 hoppo 的界面,我们可以看到这边可以选择依赖冲突的选项,然后我们可以刷新一下这边就有三个表示有冲突的,我们可以看到 右边红色的部分,就是有冲突的部分啊,这个是我们需要解决的一个冲突,因为他在这个家包里面是包没有找,找到累的异常,我们选择,然后右点击右键, 再选择 exclude, 把这个排除掉之后我们再回到 taxi 页面,我们可以看到 meng kipper 这个插件帮我们直接生成了这个 exclusions 这样的一个排除这样的一段声明,然后我们去到 这边再重新需要软弱的一下这个版本,好,等他执行完成之后,我们可以再次运行。哎,稍等一下,好,他刷新完了,然后我们再次运行这段程序,因为这边是没有填写 呃文件名称的,可能是汇报另外一个异常,但是已经解决了依赖冲突的这样一个问题,我们看一下执行结果, 嗯,我们可以看到, 哦,是现在是报文件找不到这样一个异常,所以说主要是一共两个 功能吧,一个是依赖分析内置的呃,依赖分析,如果我们需要自己手动写的话,可以不用安装插件,然后 matanyope 可以帮我们更好的直接手,无需手动去。

好了,这个底 bug 大家得多用一用啊。呃,再说一个什么呢?就做急用那套单元测试,再来个单元测试。这个单元测试是个什么东西呢? 这个可漏子 out, 单元测试。昨天咱们在做小项目的时候,咱们是不是提到过单元测试这个词,对吧?哎,怎么提的?我们说 没有任何人能保证他写的程序没有错吧?所以说我们为了错误最小化的话,我是不是每写好一个模块,要对那个模块进行一个测试啊,使这个错误最小化啊,然后就 模块测试怎么测?就把这个这个模块当中的一些方法呀,调用运行一些,试一试,看看运行的结果跟你预期的 结果一不一样,对吧?哎,那么昨天咱们用单人测试的话,用的什么东西来着?用的闷方法没问题,对吧?你不就是运行试一试吗?但是昨天咱们用这个闷方法呀,有一个不好的地方,怎么个不好呢?我们可以稍微看一眼, 不好的地方在这咱们写个单元测试,看不好的地方是一个单元测试。我把添加功能放这了,查询方法放这了。然后呢,如果你想都测试啊,你得什么修改,删除?你是不是全都得堆到这一个方法当中来 你才能测?而且呢,前后的他都得是相呼应的,对吧?这代码他都得顺序执行。那为什么实现这种形成了这种局面呢?因为闷方法在一个类中只能有一 听懂吗?哎,闷方法在一个类中啊,只能有一个。所以说呢,我们就只能把这个什么添加、查询、修改、删除。所有的测试都堆到一个方法当中来,然后呢放到一个闷中,然后去运行试一试, 那这个太麻烦了,对吧?我希望怎么样呢?我希望呢爱的方法,我给他单独放到一个可执行的方法当中 啊,查询方法,单独放到一个,可这个执行的方法当中去怎么办?那这时呢,外部给我们提供了一个插件啊, 或者是小工具,这个工具呢就叫做解忧内特单元测试啊,叫做解忧内特啊,那大部分的这个工具啊,比如说 id 啊,还是一个例子啊,都是支持的啊,都支持,我们拿过来用就可以了,那么此时注意做 写单元测试的话,那当然,通常我们这样测试吗?我们会这个规范是我要给他单独放到一个目录中,比如说 come on, 点 id, 点播点,点播,点 past, 让人一看到报名就是这里边是不是都是测试啊,然后这里边是我整个程序有很多很多的类,比如说,对吧?哎,现在虽然说只有一个,假如说这里是有十个类, 听懂吧。然后接下来我要测试,测试什么呢?我就起个类名,这个类名也是有规范的,大家注意 你要测哪个类呢?比如说我要测试 helloww one 的这个类,哎,那么此时啊,你就得叫做 hellowwww one 的 fast 得以太子结尾,让人一看到这个类的名字就知道你是针对 hellowor 的这个类,做测, 是听到吗?哎,让人一看到名字就知道你是针对 hellower 的这个类啊。做测试做到见名之义, 看懂吧。哎,然后呢,我们就可以在这里进行测试了,比如我 helloword 中呢,有几个方法,这不是有个瘦方法呢,然后再有个时代的个 word, 然后再来个爱的方法,印的 a, 印的 b 吧,比如说有两两个方法,嗯, 这行 c 三号 c 线 a 加 b 的值。行,现在有两个方法需要测试,两个方法需要测试,那么呢,但是是不得分开单独测试啊,那这个时候你想让他分开执行,你就在这里先写个圈 a 爱他 past, 至于这个叫注解,注解咱们还没学,现在你就把它理解成闷方法,格式是固定的,明白吗? 哎,格式是固定的,就把它理解成这个方法了,必须是 past, 必须是 word, 然后后边的方法名他是有规范的啊,以太死他开头,然后你要测试这个 hellower 的那种哪个方法呢?比如说瘦方法,那就叫太死他瘦小括号 看懂吧。啪啪这个 word 都是固定的,必须是啪啪这个,并且没有返回值,别写错了,你把它整体这个结构理解成闷方法理解成闷方法,格式固定的,但是不同的地方在于方法名可以改,不可以有参数列表,听懂吗?哎,不能有参数啊,是不就 一让人一看到这名字就知道。哦,我是针对于哈勒沃的类中的这个叫瘦方法进行测试,看懂吧。哎,那么此时 这个太子不是标红吗?表示现在还不能用呢,大家注意太子标红,我把鼠标移上去,鼠标放上去,他就给我提示了,让你把解忧那个四十个包啊加进来, 因为他是外部提供的插件吗?哎,所以说你得加一下啊,但是呢,工具都支持点一下,点一下把他加进来,你到这里说把加一个急用那个四点一点二这样一个包,别的都别改了,你就直接 ok 就可以了,他就会把这个包啊,自动的给你加到那个利本目录下了啊,你就一个 ok, 哎,是不是不标就是不标红了呀,并且他还给我们自动倒了包。那么现在啊,好处就在于这个方法可以单独执行了,比如说,嗯,这是,嗯,飞哥你好 帅哦,好吧,然后呢,你看这里前面是不是就有个播放按钮了呀,他就可以单独执行了啊?运,运行拍子瘦 是不可以单独执行啊,比如说,我现在又想又来一个测试另外一个了啊,叫艾特 pass, 是不是又得加一个艾特太子的呀,然后 pad 的一颗,然后 word pas。 这次要测试哪个方法呢?比如测试 helloword 中的艾特方法啊,那么就叫 past 艾特方法名啊,那这里就是 测试另一个方法,那么现在我是不是想让他单独执行啊,你就点执行, 那就叫测试另一个方法,你想让这个执行,哎,那你就点执行搞定,对吧?哎,这就是测试用力, 对吧?你就可以在这里去,比如说我们创建一个对象,叫 hello, 叫帕帕布雷克 hello word h w, 等于又一个 hellowword, 然后这啊,我的好像写的是静态方法,没必要创业对象啊, 有对象就创建,没对象你可以不创建,那就哈喽点瘦,这个是针对瘦方法的测试,然后这里呢,我们哈喽点爱的,然后添加十和二十三十,是不是针对这个方法测试啊,对吧,我看看这个方法好使不好使,运行的结果跟我预期的一不一样啊,四十一样没问题, 对吧?那这个方法你测试好了,能感受到这个测试用力的这个 这个好处吧,嗯,甚至于呢,有的时候呢,你希望在测试之前呢,你想干点别的事,你也可以再来个这个东西 艾特叫笔凤,笔凤呢,来个啪啪,这个 boy 的叫 b f 二,一把笔凤在这里边塞上。他说啊,单元测试执行前,你想干一些什么事啊?比如说你想给他美化一下, 对吧?哎,甚至呢,你也可以来个,啊,不对,就来个,哎, a f t 啊,啊,不对,然后帕布雷克叫 word 就 a f t r 吧。然后呢,就是测试用力执行以后啊,你想干一些什么事啊? 就是测单元测试执行后干些什么事,加了这个笔缝,和阿布特看一下区别。那这时当我再单独执行这个方法的时候啊,你也可以右键啊, 再把这个鼠标光标放到太子爱的这个方法名上,右键他就可以乱太子爱的 行, 看到效果了吗?测试用力执行前啊,给你打印一句话,然后执行后干了这个事,呃,执行的过程,干了这个事,然后这个方法执行后干了这个事,对吧?那这个呢,执行 没问题吧?哎,行了,那么这个呢,就是单元测试,为了方便测试用囊。

嗨,大家好,我是旭峰,欢迎大家收看本期视频啊,那么今天这个视频呢,我们将一起来看一下如何在 idea 当中进行这个单元测试,以及这个覆盖率的一个测试,对吧?首先呢,我们这个地方有一个 application test 一啊,你可以看到我这个地方有一二三四五啊,我们首先看一, 然后在他的这个类的头部有一个 springboard test 啊,这样的一个注解,然后在这个 classes 指定了一个 这个玩意,对吧?我们可以点过来看一下啊,它其实就是我们整个现在这个方定 ai 啊,它的这个 spring boot 项目,它的一个启动的这个主程序啊,启动类,对吧?啊?入口,然后我们现在需要去把它写在这个地方啊,是什么意思呢? 就是你在 spring boot 下面去做测试啊,你必须要告诉我,你要基于哪一个容器的这个启动类,或者说项目启动类来加 搭载你下面的这些资源以及相关的依赖。 okay, 比如说这个地方有一个 font service 啊,还有这个 fond repository, 很明显它是通过 autowire 注解来从那个 l c 容器当中获取资源的,对不对?所以说如果你没有这样的一个主程序,去把 supreme 的那个 相关那些环境或者说依赖给你加载成功的话,你的这个测试是跑不通的。 ok, 所以说很多同学问我啊,为什么我这个测试跑不起来?你首先检查一下这个 springboard test 注解有没有搞明白, ok, 好的,那么接下来呢,我们看到下面有两个方法,第一个是测试这个 surface 的括方法,第二个是测试这个 report three, 他去查数据库啊,什么巴拉巴拉一堆,很简单,对不对?然后我们看到左侧呢有一个小三角啊,这个地方也有个小三角,什么意思?就是这个方法可以单独去运行啊,比如说你左键点击一下,他会 给你很多运行的方式啊,比如说这是 run 呢?还是说 debug 呀?还是这个 coverage 啊? coverage 这个后面我们会讲,对吧?现在就不过多的给大家阐述了, ok, 然后这个地方有一个 一个三角压着,一个三角啥意思?就是 run test 啊,就是把所有下面的这些 test 方法全部啊,一次性的给我运行一下啊, 我们就来这个吧,对吧?啊?我觉得这个应该是比较好的, ok, 哎,你会发现它首先就是去加载一些 spring 相关的一些环境,对吧?啊? supreme 的项目已经开始启动了, 然后跑了。第一个方法啊,第一个方法是查了数据库没问题,然后第二个方法正在跑,他会去爬一些外面的资源啊,然后去更新,哎,两个都跑完了,对吧?然后他这个地方是按照你运行的这个类啊,给你去折叠的啊,如果说你这个类里面有多个这个小 好的 test 方法,他会从上到下列举出来,对不对?然后接下来我再教大家一个方法,就是这样,比如说现在是一个 test 这样的一个包,对不对啊?你很明确,你在这个 test 这个啊文件夹下面,你都是一些测试用力,然后比如说你这个地方是,嗯 嗯,我写的这个叫 test 啊,你可以写成叫 orders, 或者说叫什么啊?顾子啊,就是不同的这个领域啊,你把相应的一些测试 case 全部放在这个包下面,你可以这样去做啊,直接右键这个包,然后点 run tests in 这个,这个,这个包路径下面 啊,这个我应该不用解释了吧,对吧?啊?就是这个包下面的所有的这些测试的类,你全部都给我跑一遍啊,然后这个类里面有多少方法我不管,全部跑完,对吧?接下来我们就玩一下这个,这个玩的有点大, ok, 好,我们一起来看一下。哎,这个地方有一个地方爆粗 错了,对吧?啊,你会发现他很奇特啊,他这个地方是一个叉叉,别人都是对勾,对吧?啊,所以说 这个就要单独处理一下了,对吧?啊,我们不着急,我们等下面这个跑完以后,我们再统一来看一下啊,有哪些地方报错了,还好啊,整个你的这次运行是在 cn by wayne 方定这个包下,然后跑的是这个 test 这个包对不对?然后它下面呢,总共有这样几个东西啊?我们折叠一下看一下, ok, 总共有这样的五个类,然后呢,其他的这四个类都跑成功了,这个类是不成功的,我们点开看一下啊,这个方法是有错的,没问题,我直接右键他,然后点 run, 对吧?或者说我想看一下他到底是哪个地方冒错了,我可以 debug 一下,对吧?但是我现在想要去到这个具体的方法,他所在的那个类,我应该怎么去?右键然后有一个 jump boss 啊,就是我要去到他的这个实现源码的那个地方,对吧?啊,在这个地方啊,你会看到这个地方也会有一个小图标,就是你曾经跑过这个 case, 但是呢,这个 case 它是一个感叹号啊,有问题的 啊,没问题啊,那我们就在这个地方打一个断点,然后来到这个地方,给它右键一下 debug, 看一下它具体是哪个地方报错了。 ok, 我下面写了一个断言啊,就是这个 third by code 不等于闹, 我的理解应该是这个断言他肯定是出问题了,有可能我传的这个一二三,他查出来的这个掰扣的,他就是一个闹,对吧?所以说你 啊,我看一下啊,往下执行一下, ok, 执行一下,然后这个地方啊 by 扣的是闹,对不对?所以说他这个地方肯定是一个 force 啊,然后他这个地方就报错了,对吧?所以说我们让这个程序走完,然后在这个地方给他来一个等, 等于闹啊,这个地方就不会再报错了。 ok, 那么这个很简单,我们就不过多的来做演示了啊,我们这个地方来到一个 test controller, 其实今天呢,我主要是想给大家分享一个如何在这个 test 里面去测试 controller。 ok, 然后这个地方有一个 test controller 啊,我们利用一个快捷键啊,很快速的去给他建立一个相应的这个 test case, 比如说你在 mac 下面,你就可以用这个 command 加 shift, 然后来一个数字八, 哎,好像不是我记错了, ok, cmd 加 shift, 加上这个 t 啊,对 t, t 就是 test 的意思,对不对?然后它这个地方有一个 create new test, 点击它, 然后他这个地方会列举出来很多的这个市面上常用的这个 test library 啊,测试的一些框架,我默认选择这个 unit five okay, 然后是测试的名字已经帮你写好了啊,就叫什么什么太 test, 然后有没有副类啊?没有啊,然后它具体放在哪个地方,我们要选一下,对吧?就是我们把它放到这个台式 test 下面吧,然后点击一个 ok, 然后下面有一个方法,两个方法,三个方法啊,你想测哪个你就勾哪个, ok, 然后还有一些 set up 和 before 的这些东西,你如果有需要,那你就写啊,勾选,如果没有需要的话呢?那就不勾选啊,自己看着办,然后点击一个 ok, 诶,然后你会发现在这个 test 包下给我们建立了一个这个 test controller 的这个 test, 对吧? ok, 没有任何问题。 然后接下来我们要做一些配置啊,首先还是这样一个东西,对吧?就是我们需要把这个 spring boot 环境给他搞过来啊,因为这个 controller mvc 的一些东西也是依赖于这个 spring boot 的,对吧?啊?首先我们需要去引入一个 web applic cashing context 啊,然后还有一个这个 malk mvc 以及这个 http 的 headers okay, 这个地方我直接是把我们公司的一个这个我当时写了一些测试的 case, 我直接给它粘贴过来,因为打可能会很花时间啊。 首先你需要去把这个 web application context 就是 spring 给你传递的这样的一个上下文啊,就是加载起来,然后形成你自己的这个 mock mvc, 然后这个地方大家可以看到它是一堆加载 header 的啊,这样的一个方法,对吧?也就是什么意思呢?就是我们通常在写这个接口的时候,接口测试的时候 啊,这个手机端或者说 h 五他们跟我们交互的时候,他们可能要去传递一些啊 header, 对吧?比如说在 header 里面,他会去告诉你当前是在哪个国家,然后他使用的一个语言是什么,然后这个 diystyle, 比如说他是安卓还是 ios, 还是这个 h 五等等等等。然后还会有一些 这个 token, 或者说 time step 的一些健全的一些参数啊,这个是实际你需要有什么,你就在这里写就可以了啊。然后这个地方,比如说我想要去看一下这个 header 是叫什么啊? user token 啊,我就把这个 key 拿过来,然后给它来一个 啊,叫做这个 user token 啊,比如说这个 token 我们给它叫做 token 一二三啊,等会我们可以看一下能不能取得到。然后下面这个地方呢?它就是一个呃,叫什么呃,上下文的设置啊。这个其实啊,大家可以不用学我啊,因为我当时是为了模拟这个呃, 它有没有这个权限去操作某一个资源啊?所以说这个我直接给它删掉了啊?这个 b for each 它是什么意思呢?字面含义很好理解,就是在下面的这些 test case 每一个执行之前,我都会去啊,做一个这样的 初始化的方法,对吧?啊,所以说这个没有任何问题。 ok, 这个地方定义一个 public static final stream, 然后这个贝斯 url 吧,然后叫这个 没问题吧?就是这个 test controller 啊,他首先有一个跟路径是 aps student, 对吧?然后下面是这些这些变动的,然后写一下吧, test 啊,这个地方就不要了, test, 然后 get 它,对吧?然后这个地方有一个 request jason 啊,因为我们现在这个是一个 get 方法,所以说这个 jason 我们就不需要了,然后我们把这个 content 给它去掉啊, 然后他这个地方标红是因为他会报错啊,就是会有一些异常抛出,所以说我们这个地方加一个 sneaky throws 啊,是这个 landbox 下面的一个异常补货的这样的一个语法堂, ok, 然后有了这个 m we see result 以后呢,我们想看一下它里面具体有什么东西啊?这个没有问题, get 这个 response okay, 然后呢,你可以用这样的一个方法, get content as string, car set utf 杠八,对吧?然后这个地方呢,就是呃,福气给你返回来的一个东西啊,不要用 system out 了,用这个 log, 在这个地方我们可以去写很多的这个 expect 啊,就是这个 expect 是什么意思呢?就是我们去我们期望这个 会发生什么,对吧?啊?我们期望它,呃,这个 mattress 啊,是当前这个接口的 status 是 is ok 啊,也就是两百的这样的一个东西,对吧?通常我们去测一个接口啊,最重要的就是它 啊,返回两百对吧?啊?不可能去测什么五百对吧,肯定是要首先测两百的, ok, 然后接下来我们就来运行一下吧,简单运行一下,比如说这个地方,我们点 点一下这个 run get, 好,来看一下 post not support, ok, 我们可以看到它这个地方不支持 post 方法,对吧? ok, 那么这个地方我们给它来一个 get 啊,改一下,很简单, 有些小细节,因为我刚才从我之前老代码粘贴过来,没有看戏啊,所以说大家不要学我, ok, 然后这次我觉得应该是没问题了吧,我们的参数,这个路径,传餐,还有这个请求方式现在都是对的, 那这回我觉得应该没问题啊,你看没问题,对吧?然后 get 方法给我们返回了一个 name 啊,就是他打印的嘛,这个地方我们打印的是这样的一个东西,然后他的这个 inspect 啊,就是期望他返回的是两百,也是没有任何问题的, ok, 然后也实际进到了这个方法,对吧?因为他现在打印了这个日志啊,第一段话打印了,没任何问题, ok, 然后 接下来呢,我们再测试一下这个 post 啊,这个就很简单了,我们直接把这个地方给大家拷贝过来,刚才是 get, 现在要变成 post, 然后,然后现在呢,它就需要去让我们传递一个 content 了,对吧?啊?你看这个地方,它有一个 content type, 是 application jason, 然后我们这个地方给他来一个 content 啊,他不能在这个 content type 的下面去加这个 content 啊,他只能在这个地方加 content。 呃,然后我们就这样吧,把这个地方给他粘贴过来啊,加一个 字符串给它粘贴过来,当然你也可以去。呃,在这个地方,比如说写一个 student 这样的一个类啊, stu, 对吧?然后给它 new 一个 student 之类的啊,在这个地方传递一个 jason 点 to string 啊,这个 student 也可以的,但是我只是为了快嘛,对吧?然后现在我们来运行一下这 方法啊, run post 丢,没问题,对吧?然后呢,返回我们传递的这个相同的对象,也没问题啊,所以说这个他就调通了,然后最后一个呢,是获取这个 header, 对吧?啊?这个我们一起来看一下。 回到这个 test case 啊,然后最后一个,我们通过这样来做,对吧?问题啊,我们这个地方接口已经调通了,对吧?然后他, 嗯打印的内容看一下,哎, token 一二三啊,我们得到了这个 user token, 对不对啊?所以说这种方式是可以很大程度的去模拟你的这个 啊, postman 的请求,或者说上节课我们讲到的那个 s c t b request, 那个文件,那个脚本啊,其实都是一样的啊,我比较倾向于用这种方式啊。其实。然后接下来呢,我们来讲一下这个 叫什么 run, 什么什么什么 with coverage 啊,这个 coverage 它其实是啊一个覆盖率的这样的一个指标啊,然后我们先点击一下它来运行一下吧,就是看一下它具体是一个什么样的东西啊,这个 get, 还有这个 post, 这个什么什么 test header 之类的, ok, 然后呃他可能需要一点时间啊,然后是在这个地方会有这样的一个东西啊,但是你会发现怎么什么内容都没有呢? 呃,其实是我们需要去编辑一下的啊,直接这样来做吧, added 的这个 configuration code coverage, 然后我们这个地方呢,就把它 呃设置一下啊,你可以看到这个地方我之前设置过啊,他是在哪个哪个包下的这个呃类,才会进行这个 coverage 的这样的一个呃统计,对吧? 但是我们同时可以再给他来加一个包啊,加一个 package 啊,比如说现在我们想统计是这个方定,然后下面这个 api test 这个包下的啊,你也可以统计这个 reposter 和这个 service 啊,你多选都没问题,对吧?然后点一个 这个添加啊,也就是什么意思呢?就是我们以后啊,这个包下面的啊,这四个包下面的所有的这些 class 啊,这些类都会进行这个 coverage 的这一个统计啊,我们来看一下这个实际的效果。 apply, ok, 然后重新运行一下它, 然后还是要选择 run 什么什么 with coverage 啊,就是他的一个呃覆盖率的这样的一个统计, ok, 我们再来运行一下他,然后看一下这个地方的内容会不会显现出来, ok, 他现在出来了,对吧?然后我们把它稍微拖大一点吧,拖到 到这个地方来,我们就看一下这个 api test 吧,因为我的这个 controller 里面它其实就是,呃,它其实就是去啊空跑一些内容,对吧?没有实际的去调用 surface, 还有这个 map 的东西啊 啊,总共是这个类,我们是都 cover 住了啊,但是它里面的一些方法,我们只是 cover 了这个百分之八十八,然后他的这个代码行呢,我们是 cover 了百分之九十二的这样的一个比例,对吧?然后我们可以双击来看一下这个类啊,你可以看到现在的这个 test control 这个类啊,他左侧有这样的一个东西。 ok, 这个是什么意思呢?就是当前这个方法我们是 cover 住了啊,我们可以点一下他,哎,我们是 cover 住了,对不对?然后他他这个地方是 coverage 啊,他是命中了一次,对吧?然后这个地方呢?他也是命中了,对吧?然后他发现了我们这个地方没有被命中,对吧?然后你比如说这个 at data 他没有 被命中,然后但是呢这个 student 因为呀命中了啊,因为我们这个地方有一个 new student 啊,所以说这个就是我们通常啊江湖传言的那个 啊,覆盖率的这样的一个测试啊。 ok, 那么以上呢,就是本期视频的一个全部内容了,如果大家觉得这个视频还不错的话呢,请帮忙点赞,投币分享,一键三连,支持我一下。那么如果你还没有关注我的这个频道呢,也请你点下关注啊,我这个频道是专注于程序员干货,视频教程分享,关于程序员身心健康的这样一个频道。 ok, 我们下个视频再见吧! peace。 等一下,等一下,等一下。最后呢,祝大家中秋节快乐啊,拜拜!

hello, 今天来给大家介绍一个 idea 懒人必备插件 square test, 它是一款自动生成单元测试的插件, 会用到它呢,也是因为之前公司上了代码质量管控的指标,会考评各个项目的单元测试覆盖率。那我们先来下载一下插件,那我在这呢选择 settings, 然后选择 pluggings, 然后复制粘贴,选择这样的一个 square test, 然后安装就可以了。那重启 id 之后呢,菜单栏这边就多了一个 square test 的一个选项, 那该怎么使用呢?比如说我这边有一个 unit service 的类,里面呢有几个方法,我现在要为这几个方法去生成他的单元测试类,那该怎么去生成呢?比如说我右击,然后有一个 generate, 然后这里面多出来 两个方法,那我们选择第二项呢,他就会弹出一个框,这边呢他会自动识别出当前内需要默克的成员变量,我们可以直接点。 ok, 那它自动呢,就会使用类的真实目录层次,在 test 文件夹中呢,给我们创建一个呃,单元测试类,类名呢,就是原类名后面加 test, 那这样是不是特别的方便呢?秒秒钟就达到了代码覆盖率到百分之九十以上。那如果说大家想要这样的一个 demo 以及之前的 demo 的话呢,可以到这来这,然后给他去发一个消息,像这样就可以拿到我们的 demo。 好,今天的一个分享呢,就到这。

我们今天呢就来讲一个用 ida 时遇到的问题,那我们一般的项目呢,都是由多个子模块组成的,就比如说这边演示的项目,他会有两个子模块, b 字和 start, 但是我希望他在这个没用插件里面呢,能展示出副子模块的这种 关系。就比如说我这个英文中的多金目录能表示出来我这个 test 下面有两个字模块,那我希望我这个项目呢也能这样展示,那这个怎么样才能展示出这种副字模块的关系呢?哎,这个就在这个 menu 的小框里面选这个 options, 然后点击这里的 group models, 选上以后就会按照你的复字模块去进行一个展示了。好的,今天视频呢就到这里,欢迎大家点赞、关注、收藏、留言,后续不迷路,让我们一起进步。

来来说第二个东西啊,叫做什么呀?依赖的一个传递性,哎,啥叫依赖的传递性呀?首先来解释一下这个概念啊, 啊,所谓的依赖传递信任,咱们这么去举例子,假如说啊,我来个 a 啊, a 项目,然后呢依赖一个 b 项目,哎,或者你把它理解为炸包也行,可以吧, a 呢,依赖了一个 b, 然后呢?这种关系是什么关系呢?是不是相当于一个直接依赖的关系啊?哎,我直接啊,就把 b 依赖到我当这个 a, 这个这个这个项目当中了, 然后如果说还有一种额外的情况,假如说 b 如果想正常工作,可不可能会依赖依赖其他的其他的一些炸包啊?哎,一定会有这种情况吧,这时候呢,假如说 b 啊,又依赖了一个 c, 哎,这时候会产生一个什么情况呢?来,大家想想,他被依赖到这里边了,对不对?那 我问你,这个 c 会不会也一列到依赖到这个 a 当中,哎,也会被传递过来,这就叫做传递性,明白吧? 哎,这就叫我们微文当中的这个传递性啊,传递性,而且呢这个 a 和 c, 大家可以啊,给他起个名字,叫什么名字啊?这种关系呢,叫做间接依赖,是不是通过 b 依赖过来的呀? 哎,咱们啊,在这个依赖关系当中啊,分直接依赖和这种间接依赖的关系。好,把这个事先搞明白,搞明白以后呢,那我去给大家演示一下啊,演示下什么呢?这个 abc 三个项目啊,然后呢?来,走着就来这吧 啊,来这里边来,注意看,现在呢?我现在啊,重新关掉,然后呢打开,哎,打开这个框文件,然后呢再打开我们这个哈喽弗兰的啊,要用下它了,来,大家请看我这个哈喽弗兰的里面是不是依赖了一个哈喽,没毛病吧? ok 啊,那换句话说啊,那 这个哈喽,哎,服让的,就相当于老师刚才举的例子,那个 a 项目,这个哈喽是不是相当于这个 b 项目呀?哎,我现在把这个 b 呢依赖到 a 当中了。好,那同时假如说这个哈喽里边依赖了一些其他东西,那是不是同样也会被传递过来呀?来,走着啊,那咱们在这个哈喽里边去给他加点东西啊,加点六啊, 加个什么料呢?你在这随便写个底盘 cc, 然后呢去写一个赢个 spr 吗?啊? spr 啊,这个这个包具体能干什么啊? 他有提示啊,只要你本地仓库加载过啊。啊,一般在后续的使用过程中呢,你看都有提示啊,来加个包,你看还有版本号的提示,好吧,来,假如说我引个这个五点一点五的啊,这个包你不用管是干嘛的,咱们也不用他啊。然后呢,你就知道我现在是不是加了这么一个依赖啊,加了这么一个依赖,根据我们依赖 传递性,我就可以确定你说这个哈喽弗兰的现在有没有把这个和这个死夫人扣也依赖过来呀?来,请看这验证一下啊,来刷一下哈喽弗兰的依赖,首先我们看到他是不是依赖了一个哈喽呀,然后呢,点开 这个哈喽下面有没有这个把它传递过来呀?哎,这就叫做依赖的传递性,但是这种传递性啊,大家还要注意一个问题, 哎,这个不是说所有东西都能够传递的啊,假如说我现在给他稍微的改造一下,改造什么呢?我就把这个 把当前啊,我这个 super 人扣啊,就依赖的这个,这个包呢,给他改一个使用范,他是受这个使用范围控制的啊,你假如说我给他改一个 tiss 来,首先老师不改 tiss 的之前,你知不知道他这是什么呀?是不是康普利啊?哎,就是我们那个默认的 情况下啊,就是康普累,康普累是可以正常传递的,如果说你改了这个,你给他来一个 pass 来,打开再刷一下, 还有吗?看这啊,看,这是不是只依赖了哈喽,他所的哈喽里边依赖的东西就不会被传递过来了,哎,也就相当于说啊,你当前依赖的这个包对谁啊?对我们的哈喽弗兰的他就不可见了,他完全取决于这个包的一个使用范围啊,那如果是跑二百的呢? 会哎,也不会看见了吗?啊,猜错了吧,哎,那如果说 come play 呢, 默认是不是就康克雷啊,你看,又回来了,他自动加载回来了,看见了吗?哎,这个呢,就是我们所谓的一个依赖的范围啊,依赖的范围啊,不是依赖范围,依赖的传递性啊,传递性在这呢,也特别明确的给大家去指出来了, 你看啊,啊,这个 a 相当于咱们刚才那个哈喽伏案的,对不对?哎,这个 b 相当于哈喽,然后这个 c 啊,这个包括 d, e, 这仨你可以都理解,也是我们那个死破人扣,看,知道了吧,然后呢,由取决于这个啊,取决于咱们的 cde, 就这个死破人扣的这个依赖的他的一个依赖范围,如果是后两,后两者 ok, 他是对 a 是不可见的,看见了吗? 如果是第一个 ok 才是对 a 是可见的,可以被传递过去。听懂这意思了吗?哎, ok 啊,成, 那这个呢,咱们就说完了啊,说完以后呢,顺带呢把这个依赖的原则给大家再去声明一下,哎,就是解决炸包冲突的啊,一般来说啊,这个依赖原则啊,这个事呢,咱们上午提过,是不叫做路径最短者以及路径相同时声明者优先呀?来看一下啊, 还是那个例子,还是我们上午那个例子啊,就是 make fran 的这么一个项目的依赖了一个哈喽 fran, 哈喽 fran 的当中呢,有一个 logo f j 十四的版本啊,十四啊,然后呢,这个哈喽里边呢有一个十七的版本, 那最终呢,我这个根据依赖的传递性,什么一定会往过传呀?传递过来以后,那我是该用十四呢还是该用十七呢?是不是我得选择一下呀?那这时候呢?没问啊,自动的把你帮这个事处理了,他有一个原则,这个原则叫什么呢?叫做路径最短者优先。 来,我们首先看一下,如果说这个炸包被我依赖到我的这个麦克服案子和这个炸包啊,最终呢被我依赖到这个麦克服案子,你觉得哪个路径更长? 应该是幺七更长,是不是?人家说了我要路径最短者优先,那我肯定考虑什么用他呀,哎,他就给我 正常的依赖过来了,哎,这个呢就是我们英文当中的一个机制啊,一个机制, ok, 下面还有一个什么呀?还有一个路径相同的时候声明者悠闲,那什么时候路径就相同了呢?来往下看, 这个项目,同时在这个项目当中是不是依赖了哈喽和依赖了一个什么阿阿沃尔,这个弗兰克斯呀, 是不是依赖了两个两个项目呀?依赖两个项目,这两个项目当中也分别有十四和十七,那你觉得这会用谁?十四二十七 就不太确定了,是不是?这得取决于什么呀?取决于这哥俩啊,就这个哈喽弗兰的和阿罗弗兰的。 ok, 他们俩在我的这个 mix 弗兰的,咱 mac 弗兰的一定有个泡沫文件吧? 有吧?哎,泡沫文件?你泡沫文件写的时候是不是有那个底盘?底盘这意思?标签呀,底盘是标签里边,我问你,你依赖他们俩的时候有没有先后顺序? 肯定有吧,你先写谁啊?就相当于先声明的声明,谁 ok, 他就把谁的那个相关依赖给你传递过来了,另外那个就不要了,听懂意思了吧?哎,路径相同的时候啊,去看那个,当前这个工程里边,你先引了他俩的,谁就以谁为准啊,这个呢,就是我们依赖的一个原则啊。 哎,依赖这个原则啊。 ok, 好,那这个事说完以后呢?那咱们啊,紧接着看啊,依赖的排除来,剩下两个呢?

在 idea 中摘取 get 提交记录,当前的分值是 mass 的分值,我们来看一下 tens 的分值, 这里我们可以看到基于马斯特分支有五处提交,我们现在需要把其中的一个提交记录迁移到马斯特,那我们可以选中提交记录,点击拆人 pick 呢,就是说把该提交记录迁移到当前的分支,这里我们点击一下,我们可以看到拆人 pig 成功,我们这里直接进行推送就可以了。 我们再来看一下马斯的分支,此处已经多了一个提交记录,那这个提交记录就是生日 pick 过来的,比如说现在还有一个需求是在该提交记录中迁移部分代码,我们要迁移此次提交记录中的, 根据用户 id 查询用户,那我们如果再点击插入 pick 的话,相当于是把两个功能全部进行迁移,那这种情况我们怎么做呢?我们右击 项目,然后选择刚拍的位置,不认识进行分支之间的比较,我们选中太子的分支在左侧,这里就会列举出来两个分支之间的差异,我们只需要选择要进行迁移的代码双击,在这个界面中呢,我们还是比较熟悉的, 类似于我们平时和平代码解决冲突的界面。把需要迁移的代码来选中,到右侧,把不需要的代码进行删除,这样呢就可以实现部分代码的迁移,我们就可以只要在本地进行提交和推送。第一种方式是针对单个提交记录, 把一整个提交记录进行迁移。第二种方式呢是做分之间内容比较,然后选择性的进行迁移。今天呢就分享到这,谢谢大家。

哈喽,各位笑话好,我是小刀,今天我们来一起聊一聊死片中的循环依赖以及三 g 缓存。首先我们看循环依赖这个啊,这边我定的两个病,第一个是 thats 的病 sorvs, 我们后面就剪成 tb, 然后第二个是 thatsatsawz, 后面我们会剪成一个 ts, 那我们 tb 下面也是依赖了 thatsustvs ts, 然后同样这边的话, tastatvs 也依赖这个 taste 的 bcts, 这样他依赖于他,他依赖于他,这样就构成了一个循环依赖。当然我这个呢是用的是 boss 注入的,还有一种方法呢,还有一种方式是用构造器注入的。 那后面我们先讲三级缓存啊,所谓的三级缓存就是为了解决这个循环依赖而有了三个变量,然后通过这三个变量里面存的值,然后去解决这个问题。这么一个循环依赖,第一个是 secton object, 这里面存的都是已经创建好的单位对象。第二个呢是 altitat, 这里面存的是只有一个引用,只有一个地址,里面的属性,啥都是空的,就就一个这么一个 office 的,可以先供他这边检查缓冲的时候会使用。第三个是一个 citizen factory, 这个呢是一个工厂,就我们不会说直接去有这么一个二类 secton audio 对象出来,一定是通过工厂去创建的。 那么这个时候为什么会有个工厂呢?因为工厂也可以做很多自定义的操作啊,对不对?如果他这个哦,这个不是不是普通的一个病,是一个代理呢?你怎么搞?你就可以通过工厂去把这个代理给他生存出来,然后再暴露出来,这样里面存的就说代理就不是一个病了。 好,然后我们在讲循环依赖这一块呢,除了我这种为 soft 出入之外,还有一种是勾造器输入,但是勾造器输入他说白了其实就是反射的时候,拿他的勾造器把残守传进去,进行反射出一个实力出来吗?但是这个时候大家会发现啊,他用 勾到器注入的时候,或者用勾到器反射的时候,他需要这个参数已经是有的,然后才能去反射出来,他不能说你传一个,那么进去我就给你反射出来了,对吧?这是不现实的。所以对于勾到器注入这种情况的话,你有三句缓存是没有办法去解这个问题的。 好,然后我们看在这种循环一代产品之下,我们是如何通过三级缓存一步一步一步去把这个问题给大家解掉的。首先我们看它循环一代或者我们创建并的入口是哪里,其实就是我们产品老胜长谈的 oppoopropriatecomtics 里面的没有 frank 方法, 在后面的时候,在后面都已经并发热处理,啥都搞完之后会有这么一步啊,开始提前处理的话,我们的专利对象如果说你没有配的,如果说你没有配置艾特 lazy interest 的话,都会走到这边来。好,然后这里面他会把所有的病体分类训取一个例子的,然后去 循环,然后开始就能创建。所以他们两个在我的办法,在我的历史的中啊,他是先便利出来的泰斯特并斯瑞斯,那么就会先创建这个病,下面开始创建并的流程。第一步,该的病方法,我们的入餐是一个 b 内幕,就是泰斯特并斯瑞斯, 好,我们再去获取一个并拢,首先去检查缓存吧,检查缓存就就检查这三个值,在最开始的时候这个是零,然后这个是没有 td 也没有 ts 吗?只有以前的那个值,我们也把它写成零好了,然后这个出手画啊,提前暴露出来的也是零,他的时候也是零,就这四个是全部是零。 好,然后开始检查缓存,检查 secret, 哦,这里面有没有没有,对吧?然后进下面来检查 earthing 里面有没有,也没有,去看 factory 有没有,也没有,好,就返回空回来,返回空回来之后呢,开始真正的去构建我们的单位对象,对吧?好,然后开始盖着 secute, 然后第一步来听要创建, 就这时候这里面他就有了我们的 tb 的一个对象,创建中有了,然后再进入到 chris 并一点区,真正的开始创建这个病。 其实创建病非常简单啊,创建病就拿到那个兵卡死反射,拿出一个实力出来就生成了 tys 的病。 stvs, 这个时候他是只有地址没有属性的,就是我们这里的 thats 的病。 stvs, 他实际上是已经有这种对象存在了,但是呢,里面的属性就他里面这个属性 ts 他还是那, 但这个病已经是有的,我们要艾特一个一号,就这样子,然后下面会有个判断,如果这个病就我们胎死的病四位子,如果是单例的,并且允许循环引用,然后并且这个病是在创建中, 在创建中吧,然后就把这个病的一个三个臀发腿给他贴到这里面来,所以这里面就有了我们 tb, 一个发腿叫 tbf 好了,这边就有了啊, 但是这时候这两天是空的好,然后开始去充钱,抛开了一次我们台词的并斯瑞斯,然后通过后置处理器去发现了我们台词的并斯瑞斯面,其实是依赖于台斯的斯瑞斯的,然后开始对台斯的斯瑞斯啊,同志们就从这里开始进行一个下一步的一个创建 走,这里是台词的 siris 啊,好,继续我们开始该的病台词的 siris, 先去检查缓存,缓存里面生存的 oppo 界里面没有 ts 对吧?然后到这二零年来也没有 ts, 生存里面也没有 ts, 对吧?然后开始 好,没有,这边也是返回那了,然后开始对 ts 执行家的司令操作,然后把 ts 添加到创建中, 就这个时候因傀儡里面的既有 ts 也有 ts, 好,然后呢开始对 ts 生成,然后开始对 ts 生成一个实力对象,然后这个 ts 他也是只有地址 没有属性的,就他这里面实际上是依赖的 tb 吗? tb 还是那,然后这里面还是一个艾特二好了,好,这样的话这两个对象他既然都是有一个实际对象的,但是他的直度还是空的 好,这个时候把 ts 生存完之后,开始也进行判断,如果说 ts 是单立的话,并且允许循环引用,并且是创建中的,是创建中的吧,然后把这个 ts 也停到这里面来,我们叫 tsf 啊,泰斯德森瑞斯的一个 factory。 好,然后开始我们充钱了,我们开始抛开了一个 ts, 好,这时候精彩的地方就来了,他开始充钱 ts 的时候,发现我们 ts 是引用 tis 的变色瑞斯的,然后又把太斯的变色瑞斯又进到这里面来了,又进到这一步,只不过这边的变量已经是不一样的了啊,好, 然后开始 get it beat beat 啊,传的是 tb 开始检查缓存,第一步是一个什么 oppo 键上面有没有,是没有的,对吧?然后看二里面有没有,二里面也没有,然后但是 factory 里面倒立一步啊,三个 factory, factory 里面是有这个 factory 的,然后开始进行 factory gets, 然后把它干的结果放到这个二零 cctrlojx 里面来,所以这个时候这里面我们就有了第一个 tb 对象, 然后这个 tpf 我们不玩了,人工服掉,就他这个实力已经生存了,这工厂就没有用了,这时候 tb 就出来了。好,这个 tb 这个 oling 对象出来之后,他就可以返回了吗? 就处理到这边来,他就可以返回了,所以处理到返回之后呢,就是在填充在这里啊,填充这个 ts 的时候,他实际上是拿到这个对象的提笔去拿到这个对象了,所以这边去填充的时候,然后就是说 这个 t b 他其实啊已经不是浪了,他是什么?他上面的这边一个艾特一就是我们这个 t b 的值了,那我可以问起来了,为什么我从这个 factor 中拿到的是这个值呢?因为我们在添加这个 factor 的时候, 实际上是把我们处置化的 taste 的病 suits 一给他做了一个入餐,放到这个 factor 里面去了,可能给他做一个增强吗?我们这个 factor 就给他给他做增强的,如果说你没有增强的话,我就把这个艾特一直接返回给你,如果有增强的话,我就对这个病我做一个增强处理,对吧?像 aop 里面做增强处理, 然后把这个 pose 返回来这边你的这个依赖的 thatst bensolis 实际上就是一个 testbenpoty 的一个东西啊,就是一个待遇啊,就是一个好,这个时候我们 thatst bensslvs 就已经全部创建完了,创建完了回来之后啊,请到到到到这一步了啊,到这一步,然后 pop 了一次 thatst bensslvs, 因为下面已经把这个 ts 的创建完了吗?这段呢,抛平了一个 tb 的时候,直接打到这一层,然后这里的 ts 他也就不受控制了,他就是我们下面的这个 tsts, 二就是这个值了,然后到这一步之后,这两个循环一用,其实都已经完成了,在合适上面来,合适的背影啊,这些都完成了。哦,这个漏出来一句啊,这下面 ts 创建完成之后,就会把 ts 从这里面给它删掉, 然后从到这里面来,就在这里啊,我们把这个贴 ts 创建完成之后,然后也充钱,完成之后,我们 ts 的这个病就创建完成了吗?我把它放到这里面来,就是一个三个疼哦,这个里面来,然后他又不是在创建状态了。 然后最后我们到这个台斯的并斯瑞斯 tb 里面也创建完成之后,也可以把 tb 贴到这里面来,然后对整个东西做一个清理,这边就全部都没有了。 好,最后这么一个结果走完之后就是 cctv, oppo, gpstb 了。然后我们下一次循环的时候, 因为上次是创建的 test b c, 为什么?然后在这个入口 tree, 然后在这个入口期间创建当地对象的时候,把这个 test b、 c 位置处理完之后,开始处理 test s、 s 的时候,然后去检查缓存吗?第一步这里已经有了,对吧?就直接返回来, ok, 这两个面料, ok, 然后这两个病就全部创建完了。 所以大家可以发现啊,我们在那个平常使用的时候,主要是这两个病量在起作用,这个病量我们只存进去了,其实并没有概括出来,那么这个病量是怎么能概测出来的呢? 他的其实对应的这么一个场景,我们这里直接于 a 和 b 就进行简称了啊,我们 a 依赖于 b, b 依赖于 a, 对吧?这个流程走完之后,我们这个二零 ceansonog 实际上是有我们这个 a 这个对象的,对吧?然后下面一条路线, a 依赖于 c, 然后 c 再依赖于 a, 好,这个时候因为我们的 a 里面有了啊,所以当 c 再去依赖于 a, 再去充钱 a 的时候,他就不需要走这个 fc 了,就直接可以从这一步给他取出来,就是对应的这里啊,这里歪就直接返回了。 所以大家如果看这个变相的话啊,是啊,这虽然是三级缓存,在第一次,如果你只有一层一个属性是循环依赖的时候,实际上是只有这么一个属性是起作用的, 当你有两层依赖的时候,他正面缓和的值才会起作用。当然如果说没有两层依赖啊,就直接全部清场,就全部就全部清空了就好。以上呢,就是和大家聊的死困中循环依赖以及三级以及三级缓和如何去解这么一个问题,嗯,希望大家还是能够对着这个圆码,然后大家能够一起去把这个 实力啊做一个担保,能够一起来走一遍。反正呢,我就这么走一遍,出来之后才会有这么一个流程,这么一个结论出来,嗯, 引用一句话叫纸上得来终觉浅,觉知此事虚功行,我们一起加油。本期视频就先和大家聊到这里了,如果觉得对你有帮助的话,记得帮忙收藏点赞加关注,我们下期再见!

哈喽,这里来演示下在 ida 中对于 get 的各种常用操作,比如说像拉取代码、提交代码、切换分支,合并分支,然后充足解决等等之类的。 我们首先在我们的一个 ida 的右下方,这里有个分支,我们可以在这里去创建一个新分支,然后我们比如说创建一个测试分支啊,测试,然后创建一下,在这里他会到我们的一个测试分支上,然后我们在测试分支上写点代码, 比如说我们将这里改为一二三,那我们去提交一下,这样的话我们就能针对于要提交的一个文件去写下我们一个提交信息, 然后在右下方有一个 comet, 那我们可以点击一下 comet and push, 我们就可以提交到我们一个远程仓库,在这里我们再去剖析一下这里铺下了 不小的时候,我们可以点一下这里,然后我们可以切换到我们的一个 master 分支上面去点击切割二的就可以切换分支了, 这里可以看到我们到马斯的分子了,然后我们在这里去点击一下,我们去合并代码,到我们马斯的分子这里有个墨迹,我们点击一下就合并到我们的马斯的, 然后这里可以看到刚才写的一个一二三已经过来了,嗯。在我们的一个 get 中,然后我们可以针对于代码的这里,然后我们去右击一下,有一个我们这个按钮,我们可以看一下就是是谁提交的,去交流交流。我们下面的演示下从头解决吧。这里有个拉取代码,点一下 ok, 就可以拉取我们的一个代码, 这时候可以看到我们的一个冲突就来了,嗯,这时候我们可以在这里左边是我们本地的,然后右边是我们远程的,然后中间是我们要合并的 一个结果,我们可以点击一下这个符号,我们可以选择不要这个代码,或者说将这个代码合并到这里。如果说我们不想要的话,我们也可以去手动修改一下,比如说我把它修改为八八八, 我们这里就解决好了。解决好了之后,然后我们在这里有个就申请解决,申请我们的一个解决,那在这里我们就已经就是解决好了。 在这里有个 get, 然后点击下可以看到我们历史的一个提交日志信息。嗯,对于 get 回归代码以及像他的一个 get 的一个工作流的话,嗯,在之前的一个视频中已经分享过了,这里就不多说了。最后在 i 调中你们还有其他的一个常用操作吗?可以评论分享一下,谢谢。

static 属性为什么不能被一带注入?这里说的就是 spring 里面啊,我们都知道,如果说你这个属性是是 static 的,那么你这里加 autobot 的注解其实是 起不到作用的,这个属性呢?最终会为空啊,那为为什么呢?啊?我们这里应该反过来想假设啊,其实如果大家看过 spring 元马的话,你应该知道,在元马里面,他只不过是去 判断了一下,如果说你一个属性上面你加了 old well 的注解,但是你是 static 的,那么他直接不去进行后续的操作了。但原理上面,你如果说想要给这个属性去进行自动注入, 也是做得到的啊,在原码层面来说啊,他今天通过反射,我照样可以给这个属性去复制。那为什么 spring 他不支持呢?并不是他做不到,是他不愿意这样去做,他不愿意去支持。为什么呢?因为大 想啊,假设我现在支持我这个周瑜 service, 它是一个并对象,然后我给这个属性去呃,知龙珠入了一个字, 那假设你在其他的地方,比如说啊,某个地方你去调用这个类啊,因为你是是 dannik 的嘛,所以说我可能就可以通过这么来做调用这个类去修改的这个属性。那么你这一修改,你是不是就间接的啊?周瑜 service 并对向里面的这个属性的直接给改了, 对不对啊?所以说按照这个角度来理解的话,其实就不对。你怎么呃,通过其他的地方你,你去修改,你就间接的把这个对象里面的这个属性的值把它给改了呢? 啊,这是不太好的地方,或者说我们从另外一个角度来说,我们 spring 它是一个什么容器?是不是一个我们说的并对象的容器?它里面管理的是 对象对不对?他并不会去管理你的类,而我们这种 study 的属性,它本质上面其实不属于某个对象的,而是属于类的。这个不该由 spring 来管,也不归 spring 来管,所以 spring 他就不管, 一旦管他可能就呃觉得就就会导致更复杂更麻烦的事情出来。懂?所以说,呃从另外一个角来说是一个容器对象,他只负责管理对象而不负责管理类,而 spring or study 格是属于类的而不是对象的 啊。我觉得可以从这个角度呃更适合啊,来解解答这个问题,或者说你也可以举我刚刚说的这个返利来解答这个问题,好吧。

哈喽,写加微代码的程序员们,这里分享一个爱调中的主题插件 material sim ui。 安装完这个插件之后,可以在我们的一个 tory 这里有个主题,然后进行相应的选择我们想要的一个主题,比如说我们以这个主题为例,这里可以去看到它的一个效果是这样的,我们再看一下其他的主题吧, 比如说这个,这里可以根据自己想要的一个主题进行相应的一个选择即可,可以看到我们的一个主题,然后都比较好看。 然后这里有个小问题是对于我们文件类型的一个图标识别问题,可能不是太友好,有时候需要安装我们另外一个插件,叫我们的一个 atomme material icon, 然后我们这里去对我这个插件,然后进行开启,然后在我这里选择 ok, 开启我们这个插件, 这里可以看到我的一个图标就相对比较突出,这样一整套下来就比较 nice 了,开发起来就很开心了。最后你们有没有什么好的一个主题可以评论分享一下,谢谢。