00:00
下边我们来学习如何来配置B。配置病的内容呢比较多,我们这一小节呢,来讲这样的一些内容。第一个配置形式,我们说这节课讲基于XM文件的方式,基于注解的方式呢,我们放在后边。呃,B的配置方式有几种是吧?基于全类名的,通过工厂方法的。通过factory b的我们这节课,我们说的是通过全类名的方式来进行配置,G通过反射的方式进行配置。还会说到IOC容器有b factory跟application context。还会讲到依赖注入的方式,分别是属性注入和构造器注入,OK。我们首先看如何在IOC容器里边来配置bin。
01:00
实际上的话呢,我们在上节课我们说的这个hardwood里边,我们已经在这个application contact这个X文档里边,已经通过这个bin节点在LC容器里边配置B了,是吧,我们看啊,有这样的几个点是吧,第一个叫。ID,然后是class class我们指定了一个全类名,大家说这个权利名是什么意思啊?那看到这个全类名的话,我们就会想到应该是通过反射的方式来创建这个B的实例是吧?所以说我们会要求在我们的这个Hollywood里边必须有一个无参的构造器。OK,我来写一个代餐的,随便写一个,写好。保一下看看效果。让翻。再看看这个提示哈,是不是说这个里边没有默认的构造器啊,啊,这是不行的,拿掉。所以说。
02:00
应该是这样的一个效果。Class。全类名。病的。全背名啊,通过。反射的方式在IOC容器中创建。所以。要求。病中。必须有。无参。无参数的构造器。好了,这边的话呢,我们来说这个ID,那我通通过这个class LC容器里边创建好这个B以后呢,我如何来引用这个B呢,就是通过这个ID来用这个bin过来看啊,获取方式在这个里边哈。通过啊。通过一个ad Hollywood。
03:03
这个可以用这个B来获取这个B,比方我写一个二,这样呢,这块也需要写一个二,第三。Work。再找一个。嗯,OK的。这不是哈希码嘛,对吧,那这个是后打印,因为我在容器创建的时候的话呢,先进行呃,创建这个B的对象,设置属性,然后我再打印的这样的一个结果。都是。容器中的B。AB。没想到吧,这个ID值一定是唯一的。好了,那这个B的配置的话呢,这个ID跟class这块我们就说完了。
04:07
好,这两个搞定之后的话呢,我们先不说这个属性哈,我们到这个呃密方法里边,我们来看这块,我们需要创建这个IOC容器是吧,我们看看这个IOC容器是怎么一回事。For application。Context代表什么?IOC容器没想到吧,但它实际上是一个。实际上是一个接口。好,我们来看一下。在自不IOC容器读取并配置创建并之前呢,我们先需要对这个IOC容器本身进行初始化,注意是吧,对这个LC容器进行初初始化,只有这个容器初始化好了,我们才能够从bin里边啊,从LC容器里边来获取bin实力,而且使用。
05:03
呢提供了两种类型的LC容器的实现,一种叫b factory,一种叫application context。B factory是框架的一个基础设施,基础设施它是面向spring本身的,而这个application context是面向spring框架开发者的。注意后边这句话说,几乎所有的场合我们都使用application context,而不是使用底层的。并factory。无论使用何种方式,配置方式是一样的啊,我们使用的话呢,就是这个application context,所以说前面我们看到哦,这个是application context,继续。后边的话呢,我们看到我们用到它的,用到了它的一个实现类CTRLT一个来看继承的这个结构的话呢,是这样的是吧。
06:03
小饭。Application context有两个主要的实现类,一个叫class pass XL application context类路径下的XML格式的。Application context从类路径下来加载配置文件。还有一个呢,叫file system X application context,从文件系统里边来加载配置文件。那我这块的话呢,画了一个UML的图。我们首先这样看一下啊,来看这顶层呢是application context,这是一个接口,还有一个子接口叫。呃呃,Conigable application context,然后这个conigable application context有实现类的话呢,有这个class pass X。Application contact跟fair PH X application就是这样的一个图。接口,它下边有一个。
07:00
Conable application context,它有两个实现类,为什么要提它呢?为什么需要提他呢?因为。这个子接口帮我们实现了一些新的功能,比方说这个子接口里边新加了两个方法是refresh跟close,它让这个容器具有启动、刷新和关闭上下文的功能。我们在后边讲B的生命周期方法的时候,我们就需要用到这个close方法,所以说这块的话呢,先做一个了解。好。说application context在初始化上下文的时候就实例化所有。单利的病。言外之意就是这个B呢,还可以不是单式力的,这个的话呢,我们在讲这个,呃。B的作用域的时候,我们再说。实际上呢,还有一个这个此类叫web application context,这个是为web应用而准备的,这个的话呢,我们spring集成web的时候,我们再说好吧,所以说这块我们拿过来说,Application context代表LC容器,而这个class pass X application context表什么呢?是啊,是他的一个。
08:14
直线内。是这个。跌口。But。实现类,然后呢,该实现类。从内镜下。来下载。文件。我们说到的这个LC容器那。具体从application context读取病的方法呢,有有好多是吧,有好多有几个重载的,我们目前用的是嗯,直接用这个ID啊来进行读取,在这。
09:01
这样的方式来进行读取,我们可以看一下这个application contact。给我们提供的方法。Window做找到。Outline。大家看。这里边儿的话呢,有这样的一些方法,Application contest。我们看到这里边并没有那个该病,该病在哪呢?应该是在它的这个负接口里边是吧,我们看到了什么呀,负接口。有好多是吧,其中啊有一个叫。并facty。找到他。再看哎,这里边儿的话呢,我们看到了一些方法,这个牙货的话呢,还有。副接口就是我们说的这个叫。可检查这里边我们看到了各种艾滋病方法。
10:01
所以说这个that b方法呀,实际上是在application contact的副接口bin factory里边定义的,看到了吧,其中的话呢,用ID直接获取,我们看到是不还可以用这个类型获取啊。用类型获取可以这么写。用类型获取可以这么写,大家看一下。等于CX点点。那这个效果的话呢,我们不用去。进行强转,因为这个已经告诉我们反馈这个类型是什么了,只要一杠。这是没问题的,但大家想这样做有缺点没有?有缺点没有,比方说我在LC容器里边来配了。
11:00
两个病。这两个呢,都是hello word这个类型,那这样再返回的话会怎么样。他知道返回哪一个吗?不知道吧,是吧,啊,他不知道返回哪一个,就什么no unique b。DeFinition。Exception不是唯一的bin,所以说用这种方式返回的话,要求我这个类型的bin在IOC容器里边需要是唯一的,对吧,但是用第一种方式的话也不用,因为这种呢。我。非常这个明确的指定我要的是哪一个,这个就不会有问题。哎,我们我们说一下这这个方法啊。这个方法,这个方法是。利用。ID定位到IOC容器中的。它呢,利用类型。
12:03
返回IOC容器中搭。但要求。19IOC。容器中必须只能有一个该类型的B,对吧?好吧,这是获取病的方式,其他的方法的话呢,我们用的时候我们再说。下面下面我们来看这个属性的注入方式,这个属性的注入方式实际上是有三种方式,分别是呃,属性注入。呃,构造器注入和工厂方法注入,这工厂方法注入吧,用的很少,所以说这个的话呢,我们大家知道有这个事儿就可以了,是吧,我们也不举例子了,同时的话呢,也不推荐我们先看这个属性注入,这个属性注入指的就是通过塞方法为B的属性。
13:01
注入值或者是注入依赖的对象,就注入那个引用,注入引用的话呢,我们下节课再说。过来看。这里边儿诶。这个写法不就是通过set方法来进行注入的吗?还记得我们当时我们改了这个set方法set name to吗?是吧?这块的话呢,就是这样的一个效果,然后把这个值直接。写上这个值的话,你就直接附上了,这个我暂时给不。就是通过筛方法进行注入。也挺好理解的。这块的话呢,我们需要说,呃,这种注入方式是开发里边最常用的注入方式。还有一种方式呢,叫构造方法注入。构成方法输入呢,我们需要使用这个。Constructor a。用它来注入,因为我们这个时候是用构造方法注入,所以说constructor a这个。
14:03
子节点是没有内幕属性的。OK,我来创建一个对象,看一下效果。碰见一个卡。汽车。Private。品牌。Private。哪个厂子产的是吧。Price private marks。Private。不提供对应的盖盖塞的方法了,我来提供过招器。构造器。注意,我这样写一个。这高气的话呢,只初始化了三个属性盾。
15:03
然后呢?我来写一个。Tooth。看效果嘛,是吧。现在的话,我我来配置一下。通过构造方法来配置。B的属性。B。ID。你看这个哈啊OK。拿过来我们看这个里边的这个值是string string跟price过来。String string跟price。Contractor。Value,第一个叫品牌不敌。
16:08
第二个。Value公司上海。第三个价格。Compo。VALUE30万。写完我们试一下。获取这个卡。等于BDX减。八点。Laugh。二有一个。我们看到这个值的话呢,呃,可以获取出来,这是没问题的。好。
17:00
再回来我们这个配置的话呢,大家感觉是什么呀,我是不是按这个,嗯参数顺序来配的呀。是吧,OK。再回这个里边这么写是没问题的哈,按顺序来配的,那实际上的话呢,这块我可以来标记inex是。个人就是这样写的是吧。这个in代是一。BX是二,OK,有一个。结果是OK的,好了。再回来。我再来配一个构造器,注意哈,我把这个价格改一下,我改成一个double。这是可以的是吧。再配一个。被一个绕气,这个时候的话呢,我传入这个markb。Bubble。
18:01
最大速度,现在的话呢,我希望通过以及这个构造器来配。ILC容器里边来配一个卡。写一个吧。那个配置差不多。In。ID卡兔。Car。好的。我可以按这个顺序来写哈。也差不多呗。第一个叫品牌,我们说。吗?Contract。上海。最后这个。我说的是什么呀,它的这个最大速度,比方说。240。
19:00
好一个,我们来看看这个carto。首先的话呢,这块需要改一下了吧,因为不再是唯一的了嘛,是吧。二转。再来一个。等于CDX减B。阿布。找一个。我们看,哎。底下这个的话呢,看到一个什么呀。底下这个转完之后的话,初始化的是不是也是啊,而并不是这个mark speed吧。是吧?有歧义了。为什么我这个3万和这个二百四实际上是不是都可以给到我的。是不是都可以匹配这个构造期啊是吧,当然了,嗯,也可以都也都可以匹配这个,所以说这个时候我们仅靠这个顺序的话呢,搞不定了,搞不定怎么办。
20:11
大家想一下,哎,我们如何去?区分两个重载的方法靠什么?靠那个参数列表吧,参数列表实际上是。参数的个数,还有参数的类型是吧,这个的话呢,我们是用位置来区分的,所以说除了这个位置以外,我们貌似还可以写这个类型,对不对,第一个是Java点儿浪点儿。这个呢也是。抓哇杆儿。放点迟钝它是什么呀。类型是不一样的吧。这个呢,是。Double,我这个顺序啊和这个类型double记错了哈,我这个顺序啊和这个类型啊是可以呃。
21:06
混合使用的,找一个看看效果。哎,没有问题吧,是吧,最大速度,所以说我们说。可以指定。使用构造器注入属性值可以指定。参参数的。位置。和参数的。类型,以区分公仔的超期。以区分。Home。窄红。宏仔。的构造器对吧。
我来说两句