00:00
好,那大家来想一下,它现在到底用的是by tap还是by name呢?咱们来分析一下啊,首先呢,什么是by type,根据类型在IOC容器中去找到一个类型匹配的B来为当前的属性自动进行赋值,好然后呢,那我们的这个by name是什么意思?把我们要赋值的这个属性的名字对吧?属性名来作为bin的ID,在IOC容器中去匹配到某一个B来为当前的属性赋值。那大家想想,他用的到底是by tap还是by name呢?肯定是by type吧,对不对?为什么不可能是by name,大家看咱们在这儿咱们样来复制的这个成员变量,大家看它叫user service,然后我们当前咱们IOC容器中,然后和它类型进行匹配的,大家看一下是不是应该是它,那它的这个属性名跟咱们当前这个病的ID它俩一样吗?不一样,咱们说过用注解加扫描的方式来管理的bin的ID,它的默认值就是我们当前类名所对应的小驼峰,所以大家来看一下它叫user service,而我们当前咱们的这个病的ID叫user service I'PR然后我们当前要赋值的这个成员变量的名字叫user的DA,而我们当前这个B的名字叫user DA,撇OK吧,所以说它不是通过by name,它其实是通过by type来实现的啊。
01:25
好,那我们在笔记里面来写一下,首先大家注意咱们现在要讲的是咱们的eight o to well的这个注解的原理,注解的原理其实也就是它的一个实现过程啊,首先第一步大家注意它默认通过什么?默认通过by tap by tap的方式对吧?然后在咱们的IOC容器中,然后来匹配啊类啊,然后通在IOC容器中,然后通过类型对吧?然后匹配某个B来为属性扶持,为属性扶持或者说为成员变量来扶持,然后咱们在讲的时候啊,我经常说什么成员变量和属性,其实在大多数情况下,大家就可以把成员变量就认为是属性,因为我们说属性是跟get跟set方法有关系的,对吧?那我们当前咱们的get跟set都是大家通过out加上insert,然后生成的,所以说咱们都是以成员变量为。
02:25
模板创建出来的啊,所以说有的时候像咱们平常说的时候,对吧,咱们说成员变量属性其实都没有问题啊,但是大家要知道真正的属性它其实只跟咱们的get跟set方法有关啊好,那下面呢,我们再来看,但是它默认的方式对吧?好那大家想,那你说有没有一些特殊情况,你就比如说呀,然后我们当前咱们说的它是通过by type来实现的,默认通过by type,那大家都知的通过类型,不管是咱们通过类型获取B,还是通过类型来完成自动装配,它都要求咱们的IOC容器中有且只有一个类型匹配的B来为当前的属性赋值,或者说我们在获取B的时候,也是要求有且只有一个类型匹配的B能够获取,对不对?好,那所以呢,大家来看,那如果我现在我这里面我设置了有多个类型匹配的病。
03:18
对吧,或者说我们可以看一下,我们也可以看一下,没有任何一个类型匹配的病,这个时候该怎么办?咱们先来把它重要的一个过程先说完,咱们再说那些特殊情况啊,比如说大家来看啊,我在这儿呢,因为咱们通过注解加扫描,然后来已经在IOC容器中有user service in PL的一个并了,那下面呢,我在这我再设置一个,大家看啊,好,这是一个bam标签,然后它的class咱们等于user service I m PL,好,然后它的这个ID啊,然后我们给它来设一个就叫做user service OK吧,然后下面也是咱们再设置一个B,它的class咱们叫做user DA,好,然后呢,它的这个ID啊,咱们给它设置为user DAO OK,好,那我们现在设置完之后啊,然后咱们说它默认是通过by tap,那大家说这个时候by tap还行吗?不行,因为by tap的情况下,然后。
04:19
后有两个类型匹配的B,是不是都能够为当前的成员变量或属性赋值,对不对?好,那所以这个时候咱们的IOC容器它也不知道该拿哪一个来扶持呀,是不是好?那这个时候咱们的自动装配的注解会怎么做呢?大家来看我们,下面咱们来一个执行,大家看一下啊,哎,大家会发现它并没有任何问题,保存成功是不是也能够正常给我们输出,那这说明啥?那现在by tap肯定是不行的,因为咱们之前看过这个错,如果说有两个类型匹配的病,然后这个时候它是不是会出现问题,会给我们抛出异常,叫做no unique病,DeFinition exception,也就是没有一个唯一的病被找到异常,那现在它既然可以,那说明什么呀?大家想一下。
05:07
现在还是通过by tap实现的吗?不是,那现在通过什么方式才能够完成自动装配啊?大家想我们当前咱们的这两个类型,有两个类型匹配的B对不对,肯定不行了,那这个时候咱们还还有一种方式是不是叫做by name,对吧?那by name现在能实现功能嘛,首先control里面咱们要复制的这个service叫user service,而我们在咱们的spring的配置文件里面是不是设置了一个bin,它的ID也叫做user service OK吧,我们当前user service m PL里面来使用了一个user DA,然后那我们当前的配置文件里面是不是也有一个bin的ID,叫做U的DA?所以说啊,为什么可以大家注意,那是因为我们当前如果有多个类型匹配的B,那它就不再通过by type来实现自动装配了,而会自动转换为by name实现自动装配,也就是把我们当前要复制的这个属性的属性名作为B的ID,在IOC容器中去匹配某一个病来为当前的属性复制。
06:13
所以说大家看好它的第二个步骤,就是说咱们特殊情况下对吧,然后若咱们有什么呀,若有多个类型匹配的B,大家注意,然后此时大家看好了啊,它会自动转换,为什么会自动转换为然后by name的方式,然后来实现自动装配的效果,自动装配的效果OK,好,那什么叫做by name,在这再给大家写一下啊,然后即啊通过即将谁将我们要赋值要赋值的赋值的属性的属性名来作为并的ID,然后匹配某个匹配某个病,然后来为属性赋值,哎,选这个大家注意啊,行,然后呢,这是我们当前咱们的第二个步骤,就是它会自动的干什么呀,转换为by name的方式来实现。
07:13
自动装配就是拿着我们当前要赋值的这个属性的属性名作为bin的ad,在IOC容器中去匹配某一个B来为当前属性赋值,好,那大家说有没有第三种情况,就比如说我们现在他咋的了,他by tap也不行,他by name也不行,也就是说by type的话,它有多个by name的话,然后我们当前没有任何一个B的ID跟咱们要赋值的属性名一致,那这个时候大家说它又会出现什么情况呢?来下面大家看看啊,好,然后大家注意,然后若by type,然后和by name和by name。的方式对吧?然后都无法实现自动装配什么,这种情况是什么情况,大家看好啊,然后即咱们的IOC容器中有多个类型匹配的B,然后且这些病的ad,然后和谁要赋值的属性的属性名都不一致,哎,都不一致,然后此时会发生什么情况来大家看,比如说我把这个名字咱们改成service,我把这名字咱们直接改成DAOOK,大家看by tap也不行,By name也不行,对吧?然后现在我们来一个执行,大家会发现啊,直接报错。
08:43
报的什么错?大家来看这啊,叫做no unique病DeFinition exception看一下啊,大家注意,然后在这呢啊叫no unique病DeFinition exception什么意思?然后这个时候如果by name也不行,那他就会给我们报什么?就是通过类型来获取的时候,有多个类型匹配的B,然后才会报的这个错,这个大家看好啊,下面咱们在这来写一下对吧?然后如果by tap和by name都不行的话,然后此时抛异常啊,大家要知道什么叫做by type和by name都不行啊,好,然后此时会抛出异常,抛什么异常,No UN go b DeFinition exception,好,那这个时候我们又该怎么来解决呢?大家再来看咱们的第四个步骤,那在这咱们就需要再给大家说一个注解了,叫什么注解?叫做call注解。
09:35
叫做call费注解,大家看好,此时我们可以怎么办?此时咱们可以在咱们要赋值的属性上对吧,或者说成员变量上,然后来添加一个注解,什么注解大家看好,叫做it quality fell,哎,我先把这个写出来啊,不太不太会拼来大家看一下怎么写啊,在这直接一个eight Co就完事了,然后这个括号里面我们可以去加上一个什么呢?加上一个Y流属性值,那咱们这个注解它是用来干什么的?大家想一下,我们现在它无非就是你by type肯定是不行了,那咱们只能用什么by name,因为by type现在有多个类型匹配的病。
10:20
对吧?然后我们只能用by name,但是问题是啥?我们当前要赋值的属性的属性名跟任何一个B的ID都不一样,那怎么办?那咱们就可以通过quality fair来指定一个bin的ID来为当前的属性赋值。能听懂吧,比如说我在这来指定一个erv SE service,或者说咱们叫什么叫usererv PL,那这个时候我就可以来指定我们当前ID为user service I m PL的这个病。来为当前的属性赋值,OK吧,好,那在这咱们可以也设置一个这样的注解,叫做it quali fair,然后双引号,这里面咱们给它加上一个UDAI就可以来,下面我们在这咱们再来一个执行,大家看啊。
11:12
好,大家看现在是不是就成功了呀,对吧?所以说大家看好是什么意思啊,此时咱们可以在负要赋值的属性上添加一个注解,叫做ACO注解,It Co fair注解,对吧?好,然后通过通过该注解的什么value属性值,然后来指定一个ID,指定某个病的ad,对吧?好,然后将这个病。然后为属性赋值,为属性属性赋值,好,这个大家注意啊,咱们可以通过该注解的Y流属性值来指定某个B的ID,将这个B来为属性赋值,大家要注意,这个时候我们是并没有办法通过by type来实现的,因为你有两个类型匹配的病,所以说我们只能干嘛。
12:07
啪啪。咱们只能通过by name来实现。好,那by name在实现的时候,咱们说了它也不行,为什么不行呢?其实无非就是我们要赋值的属性名跟bin的ID不一样,那我们就可以通过这个注解专门来指定某一个B的ID来为当前属性复制,OK啊,这个大家注意,那这个呢,就是我们当前咱们的a o well的注解的这个原理,也就是说如果我们一步一步咱们来分析它到底是通过什么方式来实现的自动装配,首先大家注意它是通过by tap,然后呢,但是by tap的情况,如果咱们通过by tap不行,也就是说IOC容器中有多个类型匹配的B,对吧?那这个时候怎么办?大家注意它会自动转换为by name,也就是说把咱们当前要赋值的属性的属性名来作为B的ID,去匹配某一个B,为当前的属性赋值好,然后但是咱们也有一种情况,那如果by cap也不行,By name也不行。
13:10
这个时候会出现什么情况,这个时候它就会抛出异常,但是大家要知道。什么叫by tap也不行,什么叫by name也不行,也就是咱们当前类型匹配的并有多个,然后而且我们当前咱们的任何一个病的ID跟咱们要复制的属性的属性名都不一致,这个时候它就会抛出异常,那我们要想来把这个问题给解决了,我们应该怎么来解决?然后这个时候我们可以干嘛呢?咱们在要赋值的这个属性上啊,你给它添加一个注解叫quality fair注解,我们可以通过它的value属性值来指定某一个B的ID,然后将这个B为属性赋值,哎,大家注意,这是我们最终的一个解决方案,但是我们以后咱们会不会这样去用呢?大家注意不会。为什么不会呢?咱们下面再说啊。
我来说两句