00:00
好,为了我们后边能深入的掌握spring boot的自动配置原理,那先来看一下spring boot一些底层注解,他们是如何完成相关的功能。首先我们来看一下怎么给容器里边添加组件,我在这儿呢,准备了两个组件,一个是用户啊,有用户的名字,还有年龄,还有一个是宠物,有宠物的名字,如果是我们以前用原生的spring,我们想要把这两个组件添加到容器中,我们可以这么来做,那先来创建一个spring的配置文件,并S点好随便写。然后呢,接下来我们使用B标签,我们来给里边进行创建,B标签呢,我可以写一个ID,用户呢,比如我就叫USER01CLASS这个组件的类型,那就是我们的user这个类型,然后呢,我们组件我们可以给它两个属性附个默认值,比如name,用户的名字默认,比如我们就叫USER01。然后呢,还有他的年龄property h,比如我们就叫value,我们的18好,那这个用户呢,我们就叫张三,那现在我们给容器中注册了一个组件,然后呢,我们还想要注册一个宠物,同样的我们都是这么来写ID,比如我们宠物有一个猫,然后呢我们class,我们看我们现在呢是宠物类型。
01:19
然后我们来给它附一个默认的值啊,比如它的这个名字,这个猫的名字呢,就叫tomcat,对吧?好,那我们现在呢,容器中会有两个组件,一个是用户,一个是这个宠物,当然这是我们以前用spring插配置的方式,那我们现在呢,Spring boot,我们现在已经不写这些插spring boot怎么给容器中添加这些组件,那我们呢,也有我们这么几种办法,首先我们来看第一种,我们spring boot呢,我们现在不写配置文件了,在spring boot底层我们可以用这么一个注解,叫at configuration,翻译过来呢,叫配置的意思就说我们可以来编写一个类,好,我来准备上一个类,这个类呢,我放在con包下,比如我们就叫my conflict,然后呢,这个类我们给类上标注一个注解,就叫configuration,大家看这样的做法呢,我们创建一个类,是不是就类似创建了一个文件,然后呢,我们给这个类说明configuration类似于。
02:19
我们告诉spring这个文件是配置文件,所以呢,这个configuration就是来告诉我们这个spring boot,这是一个配置类,这是这是一个配置类,那以前呢,就等同于我们以前的配置文件,以前配置文件能做什么,我就能做什么。接下来第二个我们以前在配置文件里边使用并标签,我们可以给容器中添加组件,同样的在配置类里边我们不能写标签了,我们写一个方法,我们要把我们给容器中添加的组件,比如这个user user01,我们给他呢,自己来写代码构造出来,我来创建一个user对象,比如这个user呢,就是张三年龄是18,好,我们之前有三构造器都有,然后呢,我们不用B用标签,我们用什么,我们用这个鼻音注解,这个鼻音注解呢,就是给容器中添加组件,添加什么组件呢?就是以方法名,以咱们这个方法名名作为。
03:19
咱们这个组件的ID,我们来找一下作为组件的组件的ID,然后呢,接下来我们的返回值就是这个返回类型,返回类型就是我们组件类型。就是组件类型,然后呢,我们返回的这个对象,我们自己创建的这个对象就是组件,我们这个方法返回的对象,返回的值就是组件在容器中保存的对象在容器中的实例,哎,所以呢,这是我们使用ant b注器给容器中注册了一个,我们开来做一个测试,同样的我们把这个我们既然注册,我们就多注册一个,我们也注册一个tomcat,诶我们想要在容器中呢,有一个组件名字就叫tomcat。
04:08
好,我们这个宠物呢,就要tomca pen,然后呢,我来at b,然后我们来return,我们来返回一个new,一个我们的这个宠物,宠物的名呢,好,我们就叫好T,好,现在呢,这是我们的这个宠物,这个宠物呢,没有写这个有餐无餐构造器,那为了方便我们可以加上这个构造器,我们先来选中一个无参,然后呢,我们再来加一个有参。来选中上一个参数,好,然后呢,我们现在看到我容器中呢,会有这两个组件,我怎么验证我容器中有这两个组件呢?很方便来到我们这个主程序,因为主程序直接给我们返回容器了,然后呢,我们可以在这儿从容器中,从容器中获取组件,当然你也可以把我们这个组件的名字全部打印过来,我们先不获取,看我们打印的这些名字里边有没有我想要用的这两个组件,第一个组件叫USER01。
05:06
好,我们来搜索一下CTRLF走USER01,有第二个呢,Tom k派,哎,我们也有这个组下组件的名呢,默认是方法名,当然你不想让方法名作为组件名了,你想给他给一个自定义的名字,你也可以在这个并标签这边呢,你直接给他给一个自定义的名字,我们就叫to。走。那然后呢,我们的这个组件名就不叫方法名了,就是我们自己定义的名字。我们可以来搜索一下,等它启动完成,来CTRLF来找to有没有Tom这个组件。我来找Tom这个组件,因为这个Tom东西还挺多的。我们在最前面找,哎呀这个这个好,我们在下面找,下面找应该在这儿,诶USER01这儿呢,就有一个Tom这个组件,所以呢,这就是我们给容器中注册了两个组件,继续保持我们spring的特性,我们给容器中注册的这两个组件,它默认呢是单实力的,就是我们无论从容器中获取多少次,那都是一样的,我们可以来get并来获取一下来获取一个组件,这个组件名呢,我们就叫Tom。
06:16
我们聚焦to,然后呢,组件的类型,我们就就就是我们的这个宠物类型,好,我们精确的来进行获取,然后呢,我来多次获取。这个宠物类型的组件,因为容器中呢,我的这个宠物类型的组件,我只给他注册了一个,你最就算获取无限次,你获取的这两个组件都是一样的,咱们这个组件是不是单实力的,我们可以来验证一下,我们的这个TOM0一等不等于我们这个TOM02。来重新启动来看测试一下。好,我们发现呢,组件是处的,所以这个就是等于的,这就是我们说的默认获取的组件,那我们组件注册来的组件,注册的组件默认就是单实例的,好,我们在这儿呢,备注一下configuration非常简单,就是给一个类上标注,告诉他这是一个配置类,然后呢,配置类中用,配置类里边我们可以里面可以使用咱们这个an be应标注在方法上,标注在方法。
07:24
上给容器,给容器注册组件,然后呢,默认也是单实例的,那值得注意的是,我们这个configuration标注的这个类,它本身也是一个组件,因为在我们这个容器中,你既然是配置类,配置类也是容器中的一个组件,所以我们可以来验证一下我们从容器中能不能获取到我们的这个配置类。我们。点一个get b容器中的,我们即使告诉他这是一个配置类,我们这个配置类呢,本身也是一个组件,我们out b来打印,走起来来验证一下。
08:08
好,我们发现呢,我们已经打印到my con,哎,我们的这个组件了,所以呢,我们说配置类本身也是组件,这是说的第一个,然后第二个配置类本身也是组件,然后呢,第三个最大的特性就是在我们这个throw boot2.0,我们以后的版本里边,Configuration在这呢多了一个这个注解,它呢是基于我们5.2以后,它多了一个这个属性叫proxy being muscles,默认是true,也就说呢,我们写的这个配配置类啊,它默认这个属性是true的,那这个属性有什么用,它可有大作用。这就是跟BOO1的不同,然后呢,我们这个属性的大作用,我们翻译过来它叫proxy being muscles,我们翻译过来就叫是不是代理啊,是不是我们称为叫代理逼应的方法,这个叫什么意思?那我们现在先来提出一个大胆的这个猜想,我拿到了我的这个配置类,然后呢,我调用配置类里边的这个方法,诶我们来看啊,我们的这个配置类,我们的这个配置类里边呢,因为我们声明过两个方法,一个是USERZ01,一个是tompad pad,我们看能不能调用我们配置类的这两个方法。
09:25
B点二,然后呢,USER01我能调用,然后呢,我如果把配置类的这个USER01方法,如果我多调上两遍,会不会得到不一样的对象?C4OUT,因为我们现在看到配置类它的作用就是这个方法,USER01方法是给容器中注册组件的,我们使用ant be标注了,而但是呢,我在外边又把这个方法多调两遍,多调两遍那我们这个方法返回的这个对象,它从容器中拿呢?还是就是普通的调用方法,我们来给大家验证一下。
10:00
我们来验证一下得到的user和USER1。来给它运行起来。我们来看一下,哎,我们发现呢,这两个是处的,也就是说我们配置类里边一旦组件注册的这个方法,你在外边调多少遍,它呢,都是拿到容器中的那个实例单实例,所以呢,我们外部无论对这个方法,这个配置类,对配置类,配置类中的这个组件注册方法,注册方法调用多少遍,调用多少次,获取的都是之前注册到容器,注册到容器中的单实例。单实例对象,所以呢,我们看到我在这一块呢,得到的user和USER1是相等的,相等的原因在什么原因就在我们的这个属性,我们的这个属性呢,说我们的这个方法呢,会不会被代理会会的情况下呢,我们就看到,然后我们容器中获取到我们组建的这个对象来看啊这个my con本身,My con本身它是一个什么呢。
11:21
大家看my convi本身它不是一个普通对象,它是我们的这个enhancer by spring Li相当是被spring cg lib增强了的代理对象,所以呢,我们来说这个东西呢,我们获取到的本身就是代理对象,然后呢,代理对象呢,调这个方法,我们spring boot里边的默认逻辑就是如果configuration它是true,那我们这个类获取到的就是代理对象。就是代理对象调用方法,代理对象调用方法,那我们这个boot默认就会检查容器中有没有这个方法已经返回的组件,如果有就拿,如果没有再来调用形创,所以呢,我们这个spring boot总会检查,Spring boot总会检查,总会检查。
12:17
这个组件是,哎,这个组件是否在容器中有,如果如果有它就不会兴创,所以呢,也就是一句话,它要保持组件单实力,保持组件单实力,但是呢,如果我把这一块我调成force给大家重新来看效果,如果我调成false呢,我们从容器中拿到的这个对象my con这个类型是什么类型,它两个USER1是不是还相等,来看一下。哎,我们发现呢,拿到的这个类型就不再是代理对象,他多次调用方法得到的就不是。
13:03
处相等的值,所以呢,这就是我们说的这个proxy being muscles,哎,我们的这个东西的作用,这个呢就引申出了我们的说boot在底层configuration的两个配置,一种叫for全配置和net我们轻量级配置,如果也就是说以后我们想要给容器中添加组件的时候,我们编写一个配置类,然后呢,如果我们这个东西它代表是触的情况下,我们配置类里边每一个给容器中组件注册的方法,在外边随便调用它呢,都会去容器中找组件,但如果呢,它是false。这就是我们说的for模式,就是你把它调成true,然后呢,如果是轻量级模式,就是呢,你把它调成false,调成false呢,我们这个配置类在容器中再也不会保存代理对象,然后呢,你在外边无限次调用这些方法,每一次调用都会产生一个新的对象,那这个来解决什么场景呢?就是我们说的组件依赖,举一个最简单的例子,来到我的这个B里边,我现在这有一个user,假设呢,我柚子,我这个用户呢,要养一个宠物pet,好,我来把这个宠物加上。
14:24
我们把它的get set方法我拿过来,把这个宠物get set拿过来,把它的to string呢,我也可以来重写一下。我们把它的吐丝转来重写一下。相当于呢,我现在给容器中我注册了一个组件是用户,但这个用户呢,想要用我们容器中之前注册的这个,呃,宠物那呢,如果我调成forces模式,因为我如用户想要用宠物,这个宠物在哪有呢?我们先把这个用户拿过来。
15:00
好,大家来来把这个返回过来,这是我们的用户,这是我们张三用户,他呢想要我们容器中的这个宠物,这个宠物呢,因为我们之前用方法已经给我们容器中放上了,那我呢可以把这个方法再调一遍,但是如果是触模式的话,它就是对的,我们用户用的这个宠物跟容器中的宠物就一模一样,说明我们user组件依赖了pet组件,User组件依赖了咱们这个pet组件。如果我们调成处,这种依赖就是成立的,我们可以来确认一下,我从里边获取到user,我们从容器中获取到user,好,我们在下边来进行验证。我们从容器中来获取到我们的这个user,我们这个user的名字就叫USER01。USER01,然后呢,它是一个user类型的组件。然后呢,我们再从容器中获取到宠物,这个宠物呢,我们就叫Tom。
16:09
它是宠物类型的组件,然后呢,我们来看一下我们user里边的这个宠物是不是容器中的这个宠物,好,我们来输出一下这个结果。这结果呢,就叫用户的宠物,用户的宠物呢,我们来看一下是不是容器中的这个宠物。那如果是触模式,我们就能很方便的来解决我们组件依赖。我们来可以看一下。好,我们发现用户的宠物就是容器中的宠物,但如果我们调成了force。如果我们调成了force,那就会导致什么现象,我这个用户想要用的宠物,我把人家的这个方法掉一遍,但是呢,这个方法又不是经过代理的,现在它就是直接调,它又帮我们拗了一个宠物,虽然宠物的名字都叫汤不开的,但是它不是容器中的宠物,我可以来给大家确定一下。
17:20
如果我们调成for模式,我们来看用户的宠物,它已经不是容器中的宠物了,所以呢,这是我们spring boot2最大的一个更新,我们这个这个配置类,它可以编写我们这个轻量级模式和全模式,包括我们来点进来,我们可以看到对于这个属性的讲解,就是呢,我们的类模式就是说我们把它调成false,调成false的优点是什么啊。调整force的优点就是说我们spring boot就是呢,不会来检查我们这个方法返回的这个东西在容器中有没有,就跳过检查,我们整个boot启动运行起来就非踌快,那如果调成处,你每一次外界对它的这个调用,它都会检查容器中是不是有,所以呢,Boot给我们带来的这个for和light,我们这两种配置模式,它的最佳实战我们推荐,如果我们给容器中只是单单注册组件,别人呢也不依赖我们这些组件,我们一般都把它调成false,这样的话呢,我们spring boot整个启动过程会非踌,加载起来也非踌,如果我们的这个组件明显在下边,别人还要用,还要依赖,我们就把它调成处,能保证我们容器中它依赖的这个组件就是容器中的组件,所以呢,我们这个最佳实战老师也给大家总结到这,这就是我们s boot2里边configuration结合B。
18:45
给容器中添加组件跟我们以前的不同,以及现在的使用办法。大家也未来会在我们底层会见到非常多种这样的写法,大家呢,把核心把这一块呢理解一下。
我来说两句