00:00
来,我们接着说啊。这个spring boot,我们昨天。呃,看了两种方式,呃,去创建spring BOO的工程啊,一个是我们建没工程的方式,一个是这个spring。呃,用用他的spring插件啊,提供的spring start project这种方式。呃,为什么我说这个不是特别的喜欢这种方式呢。啊,因为你很难说就你你用spring一直你都能追着他的版本。大家看到put呢,它的这个版本呢,其实更新的还是比较频繁的。啊,他这个版本。然后呢,他在建这个工程的时候,他能给你给你提供选择的呢,只有这几个可以选。啊,你即便选这里边儿的这个比较低的这个2.1.11哈,这种他也不是说一直能够有这个选项,可以给你选它,再过一段时间它又更新了。
01:00
又更新了以后,你这个版本你也选不了了。啊,那么这个时候你你你是你建完了以后呢,可以来这个工程里边可以去。可以到这个地方啊。呃,可以到这个地方去改这个版本,但是呢,我们说很多时候吧,牵一发而动全身,你这儿改了以后呢,可能诶你就你就在这儿改完就完事了,然后你到别的地方,可能他又有跟别的地方可能版本不太匹配。哎,那你这时候可能别的地方相应的也都得也都得改。啊,这时候我们会有一些个担心啊,他可能在我们不知道的地方会有什么问题,这个就比较麻烦。所以说呢,我们。呃,完全想让这些东西掌握在我们自己手里啊,那么就是我们还是我个人还是觉得。我们按照main方式的微工程的方式去建啊,我们需要加什么这个依赖的话,参考咱们这个文档里边,这个里边都有啊。哎。
02:01
呃,这是这两种方式哈,下一步呢,我们说这个。Hello word啊,这里边儿呢,我们有一些地方呢,咱们去看一看。首先呢,我们看到有一个主启动类上面哈,有这么一个注解,Application这个注解。我们是把它标记在一个主程序的类的上面,哎。呃,说明这是一个spring put的应用啊,这个类里边的main方法就是整个put应用的入口。开运行这个慢方法启动水面波的应用。嗯,然后这个注解的里边呢,其实还有几个别的注解。呃,我们过来打开这个类以后呢,到put这呢,咱们点进去。看它的这个上面这是几个圆柱解,这个不用管它啊,就这这几个。特别是我们看一下这里边有个configuration,有个enable auto configuration,有一个component。
03:06
哎,就是这里边儿还有相当于你加了这个注解,就相当于加了加了我们这几个注解。哎,然后你看这个configuration其实就是谁呢。声明这么一个注解,它上面加了一个configuration。这个configuration就是我们以前用的那个configuration。啊,就是咱们以前用那con。啊,也就是说呢,其实它这个功能上和configuration注解是一样的,没有什么区别啊。嗯,在这儿他是有这么一个方法,他说是别名啊,他说他是这样一个东西的一个别名。也就是说呢,我们把这个注解哈,其实是另外新起了一个名字,它用的还是功能,还和以前con注解是一样的。他只不过到STEM的环境下边用它啊。然后呢,这里边儿有一个enable auto configuration,这不就是启用自动化配置这个功能。
04:06
诶,然后component scan呢,这个就是一个我们要扫描的一个包。哎,它默认情况下,按照这里边这样的这个规则去扫描啊,这配了一个exclude filters。这是一个我们要排除的,它不扫描的啊。这几个倒是它跟它底层运行有关系啊,这个我们跟我们开发的话,倒是跟我们写的代码关系不大。嗯,好嘞。这个等后边我们还有还会说有几个注解,咱们再一起一起去再介绍一下啊。下边这个object.run呢,表示启动spring应用啊,后续要加载很多的内置的配置文件,根据自动化配置加载很多组件呢,到LC容器啊,这都是它这个这里边呢,有很多这个后续的操作需要去做。我们需要大家引起重视的啊,对我们写代码会有影响的啊,是这个包扫描的方式。
05:07
嗯,现在是其实是可以有两种方式,一个是按照我们和spring这个。约定的规则。啊,约定的规则就不需要指定任何东西,它默认就是这样去找啊,这是一个约定的规则,另外一个你不想用它约定的规则,可以用手动,你自己手动方式去指定。那么我们先看一下这个约定规则啊。嗯,在的环境下边主启动类所在的包啊,你看这个是主启动类,然后这个呢,是主启动类所在的包。啊,这是主启动类所在的包。然后呢,你像这个呢,是主启动类所在包的子包啊,也就是说我们这个包它的子包。这两个包呢,这两种包啊,会被自动扫描,你不需要指定任何东西,它。
06:03
就就会扫描扫描这两个包。呃,又因为呢,我们写什么handler呀,Service这些要扫描的东西,一般不会,就直接放在主启动类这个包里边。一般我们都会建个handler呀,Service呀,哎,Map,类似于这样的这个地方啊,Do什么的。要扫描的。所以说呢,其实考虑到我们开发的一个习惯的话,主要是主启动类所在包的这个子包。我们要放在这个里边啊,你要不放在放在包那不符合这个规则,它就扫描不到了。就你看我们现在这个啊。如果我们在这儿呢,把这个给改一下。把这个包的名字改一下。中间加个二。那么我们再把这个包的层次结构呢,咱们改成这是flat是平的啊,这hierroyerchy,这是一个层次结构的,哎,那么你就能够看到这是主启动类所在的包。
07:04
这是另外一个包。他俩现在是平行的并列的关系,哎,我们扫描主启动类所在的包,哎,它下边也没有子包,那你这个就扫描不到了啊,这个因为这个包和这个包已经没有关系了,哎。所以说呢,现在如果我们把它给跑起来。嗯,启动它不会出错的。然后你这时候你要去访问的话。我们还是想去访问这个地址。HOT8080。哎,这就404了啊,这是spring boot的这个页面啊,就404了,这就肯定是404了,因为你这个是扫描不进来的。这个类啊,它这个包不符合这个我们默认扫描的规则,它扫描不进来,这个类呢,就不在LC容器里边。
08:05
那spring Mac的那个机制呢,它就检测不到有这个request map,它就建立不起来这个映射。肯定是不行。那假如说呢,你要是特殊原因,确实没没办法按照spring这个规则啊,那这个时候怎么办呢?我们就使用这个component。干这个注解。哎,这就是我们下边我们说的这个。下面说的这个手动去指定。手动去指定啊,在启动类上面使用component干注解可以指定扫描的包啊,但是此时约定规则就会失效。嗯,哎,在这儿呢,我们去指定一下我们要扫描的这个包哈。我们扫描这个包。然后呢,比如说我们再建一个符合约定的这个规则的这个。
09:00
这比如说呢,这来一个哈。来一个。呃,Special。Handler。诶,然后呢,这里边儿给他来一个。Quest mapping。Special。Control of the。有了这个的话呢,咱们下边看一下啊,给它重启一下。这个是符合我们约定的那个规则的。哎,然后这个呢,是我们手动指定的,哎,那么我们现在手动指定以后,你可以访问它,但是你这个。
10:02
这个就扫描不进来了,这个就访访问不到了。嗯,看一下啊,就hello这个呢,刷新一下哈,这个可以了,因为扫描它了。嗯,然后呢。后边这个看死掰手。哎,你看这个就四乘四了啊,所以说这个呢。呃,鱼与熊掌不可兼得啊,那你这两个呢,只能是两种里边选一个啊,你要是自己指定的话,其实你看这个注解。它里边这个等于说默认规则这种它就就被覆盖了,它就不管用了,就按照你指定的这种方式去扫描啊,那这个。那你那你就得就得和你指定的这个,你就得要去匹配。所以这个呢,叫做。手动指定。扫描的包。此时。哎,此时我们这个叫。
11:01
哎,这个约定的默认。扫描规则将会失效。呃。然后呢,下边我们看一下啊这个。我们我们这个工程继承了spring boot starter parent这个工程。而start parent继承的是这个supreme dependency这个工程。Spring depends工程管理的是环境所使用的这个依赖。这个咱们看一下啊。嗯。你看我们继承的是start parent,按CTRL键过来哈,再点进来。看一下这个负工程呢,它又继承了一个负工程啊。这是爷爷工程dependencecs。
12:01
嗯,然后呢,在这个depends里边,我们可以来看一下它的,这是它声明的属性,什么active MQ啊,各种的啊,就下边根据这些呢,就有其实都有对应的这个依赖。是不是dependency management,哎,看这里边,这是spring test,这里边都已经把版本都设置好了啊,所以说我们后边用到这些个依赖的时候,当然就不需要再写版本了。哎,就是test auto configu。哎,这是一个actor actor,这是。这个不管的啊,这个,然后这是STEM的一个。呃,自动化配置啊,这个我们看看。这个div兔子呢,是一个开发工具啊,它它它其实能够帮我们做一个热部署。所谓热部署呢,就是说我们。你这个源代码这边有修改,不需要手动过来这儿做重启,它会自动的重新加载啊,有这么一个效果。
13:09
一般我们是因为这是一个load是一个加载器嘛,我们是这两个东西是结合起来来用,嗯。嗯。看看还有没有什么比较那个熟悉的,这个是一个后边用消息队列哈,消息队列的一个,呃,Start。嗯,A的是吧,Cash。JTBC。Data的GPA。L DAP mango DB。哎,这不是red,哎,将来连red的时候就会用到它。哎,然后呢,下边这个。我们想一想啊,这个比如说。整合。整合这个看看我们后边要整合Sam lef。就是用这个start将来去整合这个Sam,哎,然后呢,这个我们的red我们也看到了。
14:04
但是呢,我们会很自然的想,我们看看有没有买。但是你发现没有?啊,没有买飞啊,这个时候不知道他们之间是不是有什么过节。Spring这边没有给提供这个买贝的这个对应的超能启动器。然后我们但是也可以整合买贝蒂斯,整合买贝蒂斯的那个starter呢。是买贝蒂斯提供的。就不是的,官方提供的是MY贝蒂。他为了跟spring的整合,他自己写了一个start,我们导的是MY写的这个。这个就是说这个。呃,买贝蒂,这是买贝蒂斯,他上赶着是吧,嗯,此波特没有提供,他自己提供一个,我也要跟你整合是吧。啊,是这么一个感觉,那spring start web啊,就是所以说我们后续呢,你需要用到这些东西啊。你像我们导这个start web这个都只是导group idifact ID是不需要再去写那个版本的啊。
15:06
包括测试的这个也是啊。哎,这就是说我们看看了一下它的这个负工程。啊,所以说这个spring呢,它给真的是封装了很多很多的东西啊,你看这个已经到500多行了,这个滑滑块还还还还在这儿呢。他这个三天做行啊,就他的这个泡沫文件。啊,他自己的这个这个倒还好,不是特别多。所以说这个都是他已经给我们管理好了,我们只需要用啥就拿啥就好了啊,用需要什么就拿过来什么啊,就所以说就是他替我们做了很多,所以说我们才能这么简单。来看下边还有没有啊。呃,说一下这个版本仲裁的这个事儿哈。啥叫版本仲裁?这个这个概念你不用记哈,我们只是给大家说一下spring不给我们提供的一些个好处。
16:02
对引入到开发环境中的架包版本进行了严格的测试。我们在使用的时候呢,我们就关心你需要引入的价包就可以了,你需要引入什么价包呢,就呃引入什么价包就行。不必关心版本号。不同价包之间的匹配关系呢?已经替我们协调好了。比如呢,在进行Jason数据转换时,需要用到Jackson。哎,就是stemc,我们需要用到Jackson,那么以前呢,我们我们得自己去注意是不是Mac和这个Jackson他们之间这个版本匹配的这个问题。因为C呢,没有去依赖Jackson。但其实呢,他用到了,但是他没有明确的写这个依赖的这个配置。所以说这个时候呢,就得是我们自己啊,得去查资料呀,得去调试呀,诶得去确认啊,他这个版本和他的什么版本是一致的。
17:02
现在呢,这个我们用了spring boot以后呢,就不用管了,我们只要你加了web start。C的这个环境下边需要的东西呢,就都有了。你不用去考虑Jackson这个事儿啊,我们看我们这里边儿有没有。这不,这个吗?Jackson data b Jackson nots Jackson Co Jackson data type Jackson。啊,Data type,还有JDK的JSR的啊,这JJ的model啊,在这找了一大堆啊,这个东西是人家已经都已经严格的确认过了,我们就不用再操心这个事了。这个事儿其实。呃,如果你像我们做众筹前半截的时候呀。呃,这个依赖关系,那个都是直接发给大家,你直接拿过来来用哈,所以说呃,大家体会不到,就是说你自己。没有意识到这个问题的话,假如说啊,然后呢,你自己得去找哪个版本是匹配的。或者说你没有意识到,然后他这个你随便导一个它运行就报错了。
18:02
啊,这个报错还挺难找。啊,还还不太容易能想到是这个他们版本之间不匹配的这个问题啊。哎,这个也是费了好大的劲才给他们找到这个匹配的这个版本啊,才才。让他们一致,现在用了spring就好了啊,这个事就不需要我们操心了。啊,其实这个是跟大家说的,是spring提供的一个福利。这个不需要我们做什么啊,不需要我们做什么。呃,然后呢,这个。哎,场景启动器呢,其实我们已经说过了啊,就是像类似这一类的东西呢。就是我们的各种starter啊,即插即用啊。呃,用这个功能就加这个start,不用这功能呢,咱就不加这个start啊,就很方便。是我们加了一个start的一个web。嗯,后边这个命令行的这个启动哈,这个我们也演示过了,呃,这个就是为了看我们在服务器上去部署的时候用这种方式,这个里边需要注意的就是说呢,我们这个环境里边哈,就是泡沫文件里边一定得有这个build。
19:07
就是spring plug得有它,没有它的话是做不到这样的Java钢架的方式去启动的,这个是做不到的。嗯。这里边儿我们说哈。呃,加了Bo这个负工程以后。哎,这里边儿呢,就是。呃,这里边儿就是这个再用什么别的这个价包吧,其实就呃,就都不需要去考虑这个版本的问题,你只要拿过来是要什么价包啊,不要去管这个他用什么样的这个。这个就非常好啊,版本已经在spring已经都替你管理好了,除非你另外再去找第三方的啊。那就另说了。
我来说两句