00:00
好,接下来呢,我们来学习第八章boot自定义starts。我们说boot最强大的一个特点就是呢,它将我们所有的场景都抽取成了这些starts,叫场景启动器,我们呢,通过引入此轮部它为我们提供的这众多的场景启动器,那就能使用的相应的场景功能,比如我们的op功能,比如我们的GPA功能等等等等。而且呢,引入了这些场景启动器以后呢,这些功能也都对于我们自动配置好了,对于我们来说,只需要在配置文件中来做一些少量的属性配置就行了。而即使是这样,我们说spring BOO,它也不能囊括我们在开发中所有的这个场景,所以说呢,我们往往需要我们自定义这些starts来简化对spring的使用,当我们来写好某一个场景的starts以后,那么别的开发人员可以直接引用我们这个starts,它呢就不需要做过多的配置了。
01:08
那么如何自定义starts,我们用了那么多的start以后呢?来我们应该提取到两点,第一点就是我们这个start,我们也称为叫场景启动器,我们这个场景需要用到的依赖是什么?第一个这个场景。需要使用到的依赖是什么?也就是说我们需要导入哪些大包,第二个我们有了这些依赖以后呢,我们需要自动配置什么,比如说如何编写自动配置。这个呢,我们以前已经看过非常多的自动配置源码了,我们可以提取一些我们能用的经验,我们呢就以我们以前的这个web mvc的自动配置为例,我们来写一个我们来找到web mvc configuration。
02:02
Web mvc configuration好,在这个自动配置里边呢,我们首先得使用configuration注解来说,它是一个配置类指定。这个累。是一个配置类,然后呢,我们在自动配置类里边也将来会大量使用到condition到啊什么什么,比如说我们需要判断一些条件,这些条件成立的情况下才开启自动配置呢,我们也可以来结合conditional on什么什么。什么什么也是说呢,在指定在指定条件成立的情况下,成立的情况下,自动配置生效,自动配置类生效,那呢,我们将来会用到大量的这些condition的on,什么什么包括呢,我们看到这里边还有auto config order,也就是说呢,我们也可以来指定我们这个自动配置类的顺序,包括呢,它在哪个自动配置之后等等等等能可以指定。
03:08
指定自动。自动。自动配置类的顺序好,如果我们需要的情况下,在自动配置生效以后呢,我们就使用各种办法,我们给at特B给容器中添加组件就行了,哎,我们可以按B。特B,给容器中添加组件就行了,包括呢,我们在自动给容器中添加一些组件的时候呢,我们可能需要用到一些属性,而这些属性呢,我们都推荐用相应的properties来干嘛呢?来绑定,使用configuration properties来绑定相关的配置。Configuration结合。结合啊结合。
04:00
结合相关的咱们这个叉叉叉properties类,Properties类来绑定我们相关的配置。这样呢,有了这些配置以后呢,我们需要在我们这个自动配置类中,比如用到这些配置类,我们可以用enable configuration properties来把这些自动配置类让它生效,哎,它的作用呢,就是让我们这些properties,让我们这些configuration properties类生效。叉叉叉,Properties。哎,生效并且呢,加入到容器中,别人呢,就能自动装配了,加入到容器中,好,这就是呢,我们一些经验,我们要写自动配置就这么来写,但是这个自动配置写完,最重要的一点,我们这个自动配置类要能加载它呢,有一个要求,我们以前看源码的时候呢,我们有说过,哎,你必须把这个自动配置类指定在哪呢?在类路径下这个文件夹中就是呢。
05:16
想需要启动就加载的我们这个加载的我们这个自动配置类要配置在哪里呢?我们这个Meta info文件夹下的有一个叫spring.tree。只要配在这个里边,那么这个配置规则呢,就像我们之前我们这个事例一样,我们来到start auto spring factor来,就是这段代码,我们来给一个实例来,我们就来这么来配,那么我们这个自动配置类就能生效了,而我们这个自动配置我们就是这么来编写,那么我们在来编写自定义start之前呢,我们再来说一些模式啊模式。
06:05
我们看人家boot怎么来编写这start的,我们也照着这么来设计一下,首先呢,我们来看这个模式里边呢,我们要说的第一个就是我们说的这个启动器,启动器呢,它应该是一个空的炸文件,只用来做我们这个依赖管理和依赖导入的,比如我们来看一下我们T在引入某一个start的时候,比如它引入start web,这个web呢,我们来看一下start web。它在这儿呢,这个炸包里边没有任何的Java代码,诶,它只是来做依赖引入的,而我们自动配置它是从哪引呢?就是从我们这个启动器里边,哎,它引入了starter,有了这个自动配置包,所以呢,我们的模式应该是我们来先来编写一个叉叉叉starter我们的启动器,而我们的自动配置呢,我们应该再来写一个啊,我们这个模块我们就叫叉叉叉start auto,我们这个启动器呢,引入引我们依赖这个自动配置,然后呢,别人要使用就来依赖我们这个启动器,并且呢,自动引入我们这个自动配置就行了,所以呢,这就是一个模式,我们也希望大家这么来设计启动机。
07:20
它呢只用来只用来做咱们这个依赖导入,当然你也可以把自动配置你都写在这里边,然后呢,专门来写一个自动配置模块,然后呢,我们这个启动器呢,就来依赖自动配置模块启动器。启动器启动器启动器我们这个依赖自动配置,那么这样的话呢,我们别人只需要,别人只需要引入我们这个启动器就行了,启动器也就说引入我们这个starter,那这个自动配置呢,也就算引进来了,一切就应该是自动配置好的,包括命名,我们来看boot官方的这些启动器啊,人家都爱叫boot starter什么什么,包括官方的自动配置,人家都叫starter,什么auto,而如果是我们命名呢,我们推荐t start在后边,比如我们之前引入的MY,人家的就叫马,所以呢,我们给启动器命名,我们也建议大家这么来命名,这呢就是一些模式,哎,我们自定义启动器,自定义启动器咱们这个。
08:43
加上杠,我们这个starter,我们希望呢,我们也这么来做好,有了这些我们这个模式以及一些约定的啊这个规则以后呢,那接下来就照着这种约束来写一个自定义启动器。
09:00
那么我来创建一个新的项目,哎,由于呢,我们接下来可能需要写两个ma项目,所以呢,我在这右键new,我来创建的时候呢,来用这个有一个叫空工程,这个空工程里边呢,我们就可以来创建自定义的这些模块,我们先来创建一个空工程,我们呢就叫。Boot,哎,我们零八啊,我们写的这个starter,我们在这个工程里边呢,我们来创上啊有两个东西,一个呢是我们这个自动配置的,来这要添加一些model啊,这要添加呢,我们就来创建一个我来new一个model,这个new model呢,我们就来用spring的初始化器,或者呢我们先来创一个漫工程,那呢先来创漫工程,因为呢,我们现在要做一个group ID,我们就来写一个com,点硅谷点starter,好,然后呢,Artifact ID模块名我们就叫硅谷的这个启动器叫start,好,我们呢先创建一个启动器,这个启动器啊,我们说只用来做依赖啊导入我们点一个next。
10:11
哎,那么这个模块呢,我们就叫硅谷spring boot。Spring start好,我们把这个名呢,我来命好,我点一个finish,这样呢,我来创建了一个模块,接下来呢,我们再来创建一个模块,来我再来创建,我来创建一个什么呢?来我来创建一个spring的初始化器,我们要创建自动配置的相关的东西,来我们用这个创建呢,比较快一点。com,点硅谷,点我们这个start,好,我们这个呢,就叫我们这个硅谷start spring。Start来,我们这个叫auto。Confi,比如说呢,我们这个auto confi,我们这个是来做自动配置的,而上边呢是一个启动器,好我们把这两个呢都来区分一下。
11:09
好,我来点一个next,好,我们也不引入任何模块,我们1510选中版本next,哎,我们来finish。好,我点一个应用,我点一个OK,那我们这个空工程里边现在就有两个,一个是start,哎,我们称为启动器,这个启动器里边呢,我们只来做依赖引入,那我来引入谁呢?我就先来引入depends,我们就来引入我们的这个自动配置包,我们来引入它,我们把它的坐标来拿来。好,这有一个artifact ID以及group ID来复制过来,我们在我们这里边呢,来引入我们这个自动配置模块,那别人要用我们的这个start,只需要引入这个启动器就行了,好,我们来说它它呢是一个启动器。
12:02
而它呢,在这里边我们来引入,引入我们这个自动配置,我们也这么来设计,引入自动配置模块,好,那这个自动配置模块呢,我们就来写一下,这个自动配置模块呢,我们把没用的这个目录结构我都删掉,好删掉然后呢,我们也不要它的这个主程序了,我们要用自动配置的,那好,我们这个po文件里边呢,我们主要引入了springb start就行了,这个test也不要了,哎,我们主要就是想用它,那么这个差价我们也不要了。好,那就引入start。引入。入,这是所有需要引入的一个基本。所有。的,咱们这个基本啊配置来我们把它引进来,那引进来以后呢,来我来假设呢,有这么一个场景,好,我呢有一个叫service类,这个service类呢,我们有一个方法。
13:13
啊,Say hello say hello,哎,我们叫安硅谷,我们来标志标志一下,然后呢,你给我传入一个人名,比如呢,你传一个名,我呢就给你返回咱们这个hello信息,哎,当然这个人名呢,我们加上我们这个艾特硅谷的打招呼信息,当然at硅谷的这个打招呼信息呢,是一个可配置的啊那我来写一个叫hello properties,我们说把所有的能配置的属性呢,我都绑在这好,我用一个叫configuration properties,我准备呢,绑定什么呢?绑定配置文件中所有已按特硅谷点哈开始的这些配置好,那么接下来呢,这里边呢,就有一处配置,比如呢,我写一个private。
14:05
我们你前缀括我们要用的这个后缀,然后呢,我们把get方法来写出来,这呢我们相当于写了一个属性,用来呢绑定我们配置文件里边的这两块配置,而我们hello service呢,要打招呼就要用到前缀后缀,我们把hello玩拿进来。好,然后呢,我们把hello properties的前缀。点get拿上,然后呢,我们来加一个杠,再加上你传过来的名,再加上呢我们的后缀。好,加上传过来个名,再加上我这个hello proper.get surface这个后缀,而这个前后缀都是可配置的来,你只要调用我们这个say hello方法,我们hello service的say hello就行了,我们这个呢,虽然是配在这了,但是我们要让它起效果好,我来写一个自动配置类,那就叫hello service auto auto configuration。
15:17
好,首先呢,我们来说它是一个配置类confi,然后呢,我们在这个里边呢,我们需要把hello service组件能注入到容器中,所以呢,Public service,我叫service,而且呢,整个配置类生效,我也给大家来写一些条件,比如呢,我们叫conditional conditional on on web,我们就写一个on web application,也就说如果是web应用情况下,Web应用。才生效。来生效好,然后呢,我们把这个加入到容器中,但是呢,加入到容器中,我们这个hello service啊,它需要用到我们这个hello properties,我把这个hello properties的get方法们给大家拿上,而这个hello properties我们是怎么拿到呢?我们在这个自动配置类中,哎,我用一个注解将enable configuration properties,然后呢,我们把我们这个啊属性文件,我们让它生效哪个呢?我们就hello properties,这样我们hello properties这个属性文件就生效了,我们直接可以在类里边我们用到这个hello properties了,哎,我们就直接干嘛呢O就行了,那好,我们接下来呢,我来扭一个hello service,这个hello service我扭出来以后呢,我们来给大家return返回过来,然后呢,我们给这个service里边,我来把我们要用的这个属性文件来设置上,来设置proper。
16:51
啊,这样呢,我们给容器中加了一个hello service,别人想用那就能用了,但是我们说了让这个自动配置类能生效,我们还得在我们这个类路径下来写一个文件夹,叫什么呢?叫。
17:10
Metafo这个文件夹,这个文件夹里边呢,我们来放一个文件,哎,这个文件呢,我们叫spring点。Re,好,我们放一个这个文件,然后呢,在这个文件里边配什么?哎,我们配的我们就抄之前的我们spring BOO的自动配置,自动配置我们需要配这个叫enable auto,哎,我们要启动的时候加载哪些自动配置类,那把我们自己的这个自动配置类我们来加载过来,我们自己的自动配置类我们的全名我拿过来copy reference,好,这样呢,我们相当于自动配置这个模块,我们才写完了来我们写了一个自动配置类,这个自动配置类呢,给我们容器中会添加hello service组件,而hello service组件里边用到的属性都是跟hello properties绑定的,而且呢,我们也配置好了,我们这个自动配置类是启动生效的,那好,包括我们这个starter呢,我们来也引入了这个自动配置模块啊,我们接下来呢,把这两个模块,我们。
18:22
安装到仓库中,诶我们这一块呢,有一些报错,我们可以看一下s RC test哦,比如说我们之前呢,是将那个测试模块已经删掉了,那我们就把这个test整个文件夹我们也删掉,好,这只是一个自动配置包,我们接下来呢,把它装到仓库中,我们方便别人来引用安装呢,由于start我们依赖了这个auto,所以说呢,我们先来安装auto life,我们来安装到仓库。好,我们让他装到仓库里边。哎,它呢,这个自动装自动配置包装到仓库里边了,接下来呢,我们把这个启动器我也装到仓库里边。
19:07
这样呢,别人就可以直接拿坐标引入了,好诶这个仓库里边两个都装成功了,那我怎么测试我们这个自动配置是不是写好了呢?我呢在这创建一个新的项目,好,我们开始spring BOO的应用,我们来测试我们这个启动器能否工作,看按硅谷来,我模块名呢是spring BOO啊零八。我们这个starter啊,我们要测试我们这个启动器能否工作。好,下一步,下一步我们来选中,因为我们这个启动器在web环境下会工作,我就来选中web,我来1510选中next,好,那么呢,就创建出来finish们在新的窗口打开,我们这两个呢,正好对比一下我们这个启动器呢,在这儿来,这是我们啊新创建的这个项目。
20:00
哎,这是主程序,好,我来写一个controller,我们要用到这个service,好,我们就是在文件里边引入我们自定义的start。引入咱们这个。引入咱们这个自定义的咱们这个starter starter,那么怎么引呢?我们把我们自定义的这个starter坐标拿来就行了,我们把这个坐标坐标呢,就在这儿,好,我们来复制过来。哎,这就是我们启动器的意义,我们指引启动器的坐标,那么启动器呢,会把自动配置的相关依赖都导进来,我们也可以看一下左边这边我们看一下,诶这有com and硅谷,这是我们的启动器,包括呢,还有我们的这个自动配置包也都导进来了,那好,那这样的话呢,它这个自动配置应该是生效了,我们能不能注入我们service呢?哎,我就来写一个controller测试一下crler点我们就叫hello controller。
21:01
我们来自动注入我们at硅谷的hello service,诶我们看到是有的,没问题,那我写一个autowa看行不行,包括呢,我们在这来rest CTR,而我们这个service里边呢,来写一个方法来返回这个这个hello方法,我们就调用我们这个service hello service.hello硅谷好,我们呢把我们这个人名比如呢,哈哈。来放进去,那返回的这个字符串,我们让它写给浏览器at get map好,我们发hello请求,而由于他写的时候呢,有前后缀,前后缀呢,我们直接可以在配置文件里边配,配什么呢,跟按特硅谷,哎,前缀哈,我们来可以看一下我们这个自动配置,我们叫hello practice,它来绑定的是前缀呢,是硅谷,Hello,那就at特硅谷哈。
22:05
然后呢,接下来是一个perfect跟surface来写一下这个at硅谷hello.perfect好,比如呢,我们就叫at硅,还有呢,我们at硅谷hello的surface后缀,Surface后缀后缀呢,我们就叫啊hello word。啊,我们把这个写上以后呢,我来重新来启动我们这个应用,能看我们这个自定义start能不能。正确的引入进来。好,我们启动起来呢。哎,这个应用呢,是启动起来的,也就是说我们这个hello service也是引入进来的,否则呢,如果引入不进来,这一块就可能报错了,我们就直接来访问,那就local host80来问,回车hello后缀按硅前缀,那么这个问也是没问题的,那这个自定义start就是这么来工作的。
我来说两句