00:00
好,我们继续来上课啊。刚才呢,讲的第一种方式叫做by name,它比的是名字,那接下来看第二类,第二类呢是叫做by type,它比的是类型,第二种方式叫做by type。Tap它叫做按类型注入,按类型注入啊,那这个方式说呢,我们Java类中引用类型的属性。啊,应该说引用类型的。呃,这么说叫数据类型啊,它的数据类型和容器中,也就是配置文件中声明的B容器中B的class属性。是同源关系的,是同源关系的,这样的病它能够赋值给引用类型。
01:18
好,这是by typeb也是类型,是说你引用类型的这个数据类型啊,和这个class值去比,Class代表不也类型吗?比试类型,类型呢叫同源关系的。哪些关系是同源的呢?我们这儿有三个算是同源的,同源就是一类的呗,同源就是一类的,同源就是一类的意思。啊,一类的意思同有三种,第一种呢,我们是说你Java类中,Java类中引用类型的数据类型和class的值是一样的,这个没那么多说的,你要是一样的话,肯定是一个类型的嘛,所以一样的这是第一种。
02:17
第二种呢,是说你Java类中引用那个数据类型,这加一点啊和B的的值啊。和B的class的值呢?是父子类关系的。也就是说,你的Java类中,这是一个负类。拉这个值呢,是一个子类,那当然子类可以当做负的来用了,所以他们也是一个类的意思,就是一类的意思,都属于同一类的。这是第二种,第三种呢,它只是说。引用类型和变class的值呢?是接口和实现类关系的。
03:04
那就是说这个是一个接口。是个接口。而这个class值呢,是实验类啊,是实现类。那么它们也属于是一类嘛,啊,这是同源关系的,怎么用同源关系呢?把by name换成by type关键字就行了。By name and by type。好,这就是可以了,就是by tap就完事了,那怎么用呢?我们这儿给大家试一下啊。我看看代码部分,我们再来个新的包吧,来做这个。先再来一个package ba05。把零四的代码呢给它挪过去。配置文件零四负这一份叫零五,打开零五啊。
04:06
By name,这换成by type。这换成白菜关键字。啊,这个换个名字吧。换一个张。啊,就找他吧。好,然后呢,我们来看看包的名字,应该是零五啊。零五。好。这是我们的学生,这是我们的学校。换一个换一个人民大学,人民大学啊好了,零五的。那么这呢,用的是by type,那为了和之前的by name呢有所区别,这个名字呢,我换一个,我不叫school了,我叫做my school,换一个名称啊,换个名称。为了避免和丢单的类中引用类型的名字呢,有重逢两个名字不一样啊,不一样。
05:08
这类再来一个。打开零五,先把导入的类呢改成零五的,然后里边呢,这是零五下面的配置文件啊这测试。看看我们的有类型,能放上值吗?看结果啊,人民大学复制成功,看这复制成功没问题。这是by tap,那by tap怎么解释呢?那他是说。当我们在读取配置文件的时候,当遇到并标签创建对象。引用类型赋值,再看I spring框架,就会找到student类中引用类型的数据类型这一部分。
06:00
拿它之后和你配置文件中每个B的这个class值去比,看一看这个class值是不是符合三种同源关系中的任何一种。那你跟这个比一点关系都没有,它就pass掉了,再看跟这科大比一看类型应该是一模一样的吧,它应该属于同源关系第一种啊。它是符合要求的。那就把这个MY组对象赋给了子部,所以引用类型就复制成功了。这是by type,它比的是class,这啊,比如这,那么第一种同源关系一模一样的最好理解。我们再看一下第二种方式。父子类关系,那么父子类关系,那说Java类中的这是父。然后我们这个B呢,它代表的是子好,那我现在需要一个父子类呀。
07:04
在存在中它是隐类型,它应该是负。还需要有个子类,那我们在零五包中,我创建一个子类就完事了,我叫做小学子,它呢,继承我们的子故,那这样的话,它就不是子类了吗?这是子类啊子类。子类呢,可以继承父类的属性,可以使用父类的。公共方法,所以此过负类中呢,我们的这些方法都是可以使用的啊,都是可以使用的。那现在我要声明子类。打开配置文件。我首先呢,把原先这个死库呢,先注释一下,不用它了。我们下面声明一个此故的子类,子类啊,那我们来声明一个并ID,这个呢,我叫做prime。
08:10
School class school,它从负类中呢,再继承我们的属性myname为我们说北京小学,Hello party地址这个呢,在北京的大兴。大兴区好放在这。那现在我们看一下,我们指定outwa是by type啊,By time。在这。那么这个子类,它属于同源关系的第二种。他能不能复制成功呢?看一下我们的验证。找测试执行方法。
09:06
结果。我们看啊,在school方法执行了,这是北京的小学,咱们看复试成功了,那说明宏源宽第二等完全没问题,负责成功。在代码中。代码中哦。代码中它是一个负类。我们赋值就是一个子类,那么大家想啊,即使我们自己去赋值,我们说在这你说new一个primary school,这是不是也是正确的,没问题吧。那这不就是负吗?这就是子吗?子类可以当做负类使用吗?所以spring也遵循这种原则,把一个子类对象赋给我们的词库完全没毛病,所以复制成功。这是BYT第二种图形关系,那第三种什么意思呢?第三种就是说这是个接口。
10:04
这个借口。在配置文件中,那我们赋值的。这个对象应该是接口的实现类。啊实现类,那这种方式呢,我就不给你演示了。它实际上就跟我们成语中我们那个作业是一个道理,在零三项目中,我们来看这种复制关系,就是接口实验类吗?打开我们的,我们看service。你看。这个属性它是接口吧。是接口。接口,我们负的值应该是UDAO接口的实现的对象啊。配置文件中会这么负的吗?它这个接口你负的这个值是接口的实现的对象吗?那么这种班就属于第三种接口和实验内啊,就完事了,行,那这种关系呢,我给你演示了啊。
11:02
往下来我们看有这么一个小小的问题。还是回到我们刚才演示的。按类型注入的第五这个程序中。那我们现在呢,是给这个school。An by time赋值。也是类型,类型呢,有三种关系,算是同源的。一样的父子的接口和实验类的好,那现在看这么现象。我现在呢,把这个负类死库的定义打开。这是一个词,固类,它符符合同源关系的第一种。这是子类,它符合同源关系的第二种,那下面如果我现在呢,去执行我们的测试方法。执行刚才那个零五的方法。刚才是正确的,那现在如果再执行会发生什么呢?程序是正常呢,还是会失败呢?
12:06
现在执行的话,大家可以想一想啊,失败失败还是成功呢。现在我来执行的话。好,看一看啊,目前的结果应该是红色的,很显然应该伴有异常。那看看异常的说明在哪儿呢?来给大家找一个最明显的一个说明的语句啊,那个在哪,我看看。好在这。这句话啊,我再往右侧移动一下。这块首先看这异常的名字啊,叫做没有唯一的病,定义异常就是说你没有一个唯一病。为病,就说你没有无为一病的异常。
13:02
说你的这个故类呀,故往后来啊再看。我们期望的是single是不是单个的匹配呀?单个就是一个呗,单一一个的匹配,但是发现有几个符合要求的呢,两个。这两个都是符合要求的,那你看就歧异性的呗,那我们都其实我们都知道计算机呢,认为是唯一的,那唯一的你现在给两个肯定就是不行呗,有问题呗,所以你得保证符合条件对象只有一个才正确,目前来说。多余一个是错误的,所以打开配置文件,我们把这个得声明一下,二选一留一个,比方说我把子类这个声明给他注释了,这样才可以啊,实际上我把这个打开之后啊,你看看idea中给你报错的。你看这个B的声明这块是不是有个红色的一个下划线呢。
14:02
你把光标移上去,它会有提示的。其实就告诉你了,说我们这个B。这是不是多于一个病的声明啊,多一个不能够自动注入,因为就是说你这个死故有俩。多于一个它是不允许的,所以呢,你二选一,你保留一个。保留一个那。我们这儿给大家提供一个注意的说明啊,注意在by type中,在XML配置文件中声明B的时候,声明B只能有一个符合条件的。符合条件的目前来说呢,是多于一个是错误的,所以一个是错误的啊,要注意这一点。
15:03
比如现在BY中。你就只能有一个,目前来说在配置文件中说明B只有一个符合条件,多一个是错误的,就是by cap自动注入啊。这两个字,呃,注的方式呢,在我们的项目开发中啊,用的最多的啊,最多的。
我来说两句