00:00
接上一节课。上一节课呢,我们在这个呃,对应的B上边添加上了对应的注解,然后我们在配置文件里边搞了一个。Content component sc,然后我们就可以把标识注解的那些B交给LC容器进行管理。但是还差一点是吧,我们知道这个病和病之间往往具有关联关系,这个关联关系怎么搞。首先我们把这个关联关系呢,给它建上C里边我们应该搞一个service。Service。调用这个方法有点。这位子里边有一个。Upoy。
01:03
调这个PY的自方法好了,像这个关联关系的话呢,我就写成了。那下边我们要是调用main方法的话,希望是一个什么效果呢?我直接去获取这个controller。然后。调用controller的。SQ的方法能够打印出三个字符串吧,哪三个?一块打出一个。一会儿打出一个爱,一会儿打出一个。Save。应该是这样的一个效果。那我现在运行的话能好用吗。先看。哎哟,一上来就出了个错是吧,因为这里边还没有一个B叫优controller呢,为啥呀?这个配置文件还是我们上节课写的那个,这个需要来改一下。
02:09
把这个配置的这个。属性去掉再来。这个时候这个异常是控制针异常,我们看到了这个controller是可以打印的,说明这个controller已经给LC容器管了,是吧?XQ的方法没问题,空指针异常咋回事?我CL里边我是不是还没有装配这个U盾service呢,这个属性还没有进来。好了,下面我们看我们如何利用注解来建立B和B之间的引用关系。看PPT。实际上呢,我们这个contact component sky元素还会自动的注册一个auTo B b post processor这样的一个实例,这是一个bin后置处理器,这个bin后置处理器可以自动装配,具有out where resource跟inj的注解的属性。
03:10
啥意思呢?就是说我直接在我的这个属性上添加这样的注解,它就会把那个bin自动的装配上。我们先看这个auto wear的,那这个的话呢,实际上也是我们最常用的哈。奥贝的注解可以自动装配具有类型兼容的单个并属性,那这个可以放到构造器上边普通的字段上边。啊,一切有参数的方法上边,那我现在的话呢,就是一个普通的字段,我加上一个。爱。Auto weird。后来我也加上一个act outwa。什么意思啊,然后上IOC容器里边去找,看看有没有跟这个类型兼容的bin,有的话直接加进来。
04:07
走一个,瞧一瞧。是不是OK了啊,这就是auto。再过来看说。奥贝尔的自动装配具有兼容类型的单个并属性,可以放在构造器上边,普通字段上边,以及,以及,呃,具有。参数。有具有参数的方法,上边就是说你也可以搞一个。Set方法,把这个放到set方法上也是没问题的,看set。Olderposy。放这儿也是OK的,你看。这也没问题。哎,现在看起来的话呢,一切都很好,这个功能也实现了,我们再来看一些细节。啥意思嘞,比方说我们现在这个,呃,Upoy以及。
05:07
我在controller里面用的这个。呃,Service LC容器里边是不是有这个属性啊,是LC容器里边是不有这个B呢。没问题,那如果LC中基本上没有这个B,它会怎么样呢?没有没有这个B,我现在的话呢,我来做一个这样的一个实验,这里边的话呢,来搞一个。Taste。搞一个他进来可以加一个注解。At auto。然后这块的话呢,我打印的时候啊。打印的他object,大家说我现在要是好的话,能跑起来吗?能吗?我LC容器里边是不是有这个test object对应那个实例啊,所以说能跑的起来。哎,没问题,好了,现在我说如果容器里边要是没有这个病呢,把这个干掉。
06:08
别走。没有他了哈,你看。启动的时候就会出错,出什么错啊,他说我没有一个B的类型是test object,这个时候就出错了。那。默认情况下,所有使用艾特奥wa的注解的属性都需要被设置,如果斯spring找不到匹配的那个B的时候的话呢,就会抛异常。如果我们允许这个属性值不被设置的话,我们可以设置autobe的一个属性required false就可以。于是我们到这个里边来啊,没有也行,怎么讲。Required等于false,这就可以了。带走。即便是他没装配上的话,也可以打印的。啊,我们说了一个required等于false这样的一个属性。
07:04
那就是没有。没有这个病那。再来,如果我的这个LC容器里边有好几个类型相匹配的B怎么办?它会出错吗?我这块来,我再来搞一个类,比方说我叫。C。Epoy。哎,我也来执行那个接口user,注意。方法呢,我加一下就可以了,加个方法。写个写个什么呢。这个他的。都有方法。打个at rey。加上了。
08:01
什么意思啊?我现在在LC容器里边啊,有两个upoy这个类型的病吧,一个是u JD bcpoy,还有一个是UPOY2个类型的,而我在service里边的话呢,我在进行。嗯,装配的时候的话呢,我装配的是一个u report这个类型吧,这是一个接口类型是吧,而这个接口类型有两个直线。现在我们找一下看一看怎么样。没有发生错误。运行是正常的。诶梳理一下哈,LC容器里边的确是有两个U的reporty实例吧,一个是JDBC这个类型的,一个是input这个类型的,我们看都实现了接口。是这样的对吧。而我在这个service里边,我用的是谁呀?我用的就是这个,呃,接口类型,那你不有俩吗?我搞哪个呀?啊,默认情况下,如果有两个类型的话,他就会去对那个B的名字。
09:16
就是说这个out wear的,如果有两个类型的话,他就会去找这个名字,你看我这个名字是不是有一个B刚好叫upoy啊。这块写的吗?好比方比方说把这个名字拿掉。可看。对。这个时候就不行了,说什么了,他说,嗯。你实际上的话呢。我没有一个唯一的病。是吧,我没有一个唯一的B被定义,我希望是一个,那实际上我找俩,所以说出问题了,那怎么办呢?啊,一种方式就是你写一个就这样是吧,写一个让这个信的名字刚好跟这个属性名一致。
10:10
就可以。这样就可以再找的话就没问题了。好的,我把这个呢。到字段上来再看。再找。也没问题。这种方式。好,还有一种方式,比方说我在这个里边呀,哎,我没有写这个名字,这个时候我们知道有问题了是吧。那这个时候这个名呢叫u reporty,那我可以再进行光配的时候,指定这个名字用一个注写叫爱啊。Coli。指定一个名字叫。这也是可以的。
11:01
我指定具装备哪一个。这个哪一个指定的病。再看。没问题,看到了吧,这也是可以的,那你要是用set方法呢。Set方法的话。拿下来。哦,一个。没问题,实际上我这个注解还可以加到。参的前面这样也行。这种加法大家注意一下啊,我们在这个Mac里边,我们会经常有类似于这样的这个方式,就是说把这个注解啊,加到入参的前面。再看。哎,OK的,好了,这是我们说的这个out的又一个情况。如果LC容器里边存在着多个类型兼容的bin的话,我们应该怎么做?两种方案。一种方案是我们使用这个。
12:03
At。克菲尔这样的一个注解,还有一种方案的话呢,就是我在声明这个B的时候,我这个bin的名字就跟这个属性名或者是字段名相一致也可以。好的,那其他的我们还可以使用这个autob的,呃,放在数组上边,放在集合属性上边,放在map上边,放在数组,放放在数组上边的话呢,是不是LC容器会把所有匹配的B都转配进来。放在集合上边。不会读取集合类型,然后的话呢,把类型兼容的都匹配上。Map上边他会拿那个呃,B的名字作键,拿那个B本身作为值放到map里边,这三个的话呢,我们就不举例子了。除了我们前面说到的这个outwa的注解呢,我们还可以使用resource跟inject来自动装配B,但是这个resource跟inject这两个注解的功能啊,跟out where的相类似,所以说我们建议使用这个out where就可以了。
我来说两句