00:00
各位同学大家好,刚才呢,我们手写框架实现了IOC功能,也就是我们自己定义的一个注解叫做bin,然后在我们的类上边加上bin的这个注解,最终实现了对象创建,包括咱们刚才测试最终也都成功了,那下面呢,我们继续来写,我们来写这个部分就是Di,比如咱们现在这么来做,我在里边通过Di入DA,然后我现在调用do中的方法,最终能进行输出,将它实现出我们之前那个或者resource效果,做一个注入的过程,现在因没有写,我现在执行呢,肯定它会出错,因为咱没有写到,大家看一下,你看里边直接报错了,因为目前这个肯定是没有,那咱就要实现用Di注解完成这个注入,那咱们看这个该怎么去做,跟刚才的过程基本上是差不多的,那咱们课头写一下。首先第一个啊,还是来到刚才的这个no这一类里边,然后在里边有一个有构造,咱传了一个径,刚才咱是创建了B,那下面呢,我在里边再加上一个方法,就在这个有三构造中,咱再加个方法,这方法完成属性的注入,那我们给它起个名字,就叫漏的这个Di。
01:25
这是我们加这个方法,然后在Di中完成咱们最终的这个注入。这个我们来写一下。下面开始写这个方法。写到这位置。啊,就是进行这个属性的注入,咱们把方法放到最后啊,最后来。放到我们的这个位置。咱们最终进实现,然后按照我同样的方式啊,我还是把这个步骤给各位先一步一步写出来,然后咱们一行代码一行代码,最终进行实现,那咱们讲这个步骤啊,那大家该怎么做,首先第一部分男是要进行使用注入,那首先第一个男是先得到我当前类中所有属性,然后判断使用上面到底有没这个注解,有的话把它进行这个注入啊,就来做这过程大才说的详细点,目前要得到类中属性,那这个类咱是不是要得到,所以这是我们的第一部分,而咱目前创建的类的对象应该都是在我们那个b fe的map集合中。
02:33
也就是都是在我们的这个位置。所以咱们啊,按照这个思想,我们来写一下,写下它的步骤啊,首先第一步就是因为我们实例化的对象。它都是在这个factor这个map集合里边,所以咱的第一步操作怎么来做呢?我写一下啊,这位置我们的第一步,咱们就先把这个这个集合进行历。
03:05
啊,遍历这个外部集合,然后遍历外部集合之后怎么做呢?得到里边就是每个对象,包括把每个对象中的属性都得到,这是我们要做的,写一下啊第一步便利。然后便利之后,第二部分获取map集合里边的每个对象,就是它那个Y6值,Y6值就是对象嘛,然后把每个对象中的属性给它都获取到,这是我们做的第二部分,然后看第三步,因为每个对象中可能没有属性,可能一个属性也可能有多个属性,属性也可能是公开的,也可能是私有的,但是咱们都要给他得到,然后得到之后这里边肯定是有很多属性,你可能没有,它返回的应该是一个数组形式,我写一下啊,所以第三步就是。便利。
04:01
咱们得到的每个对象属性的那个数组。把它做个便利,然后便利之后得到里面的每个属性。啊,就是便利把每个属性得到,然后每个属性得到之后怎么做,第四步跟刚才一样啊,咱就判断一下这个属性上面是否有我们这个,就是叫艾D的这个注解,看它是否有这个注解,然后第五步如果说啊,他有这个这个注解,有这注解大家怎么做,就给他把这个对象就给它设置到我这个。当前这里面去就给他做一个注入,把对象进行设置,或者进行这个注入。以上就是一个基本的过程,我再重复一遍啊,然后咱写代码,因为咱目前实例化对象都是放到这个map集合中,所以首先第一步操作,把外部集合先进行遍历,遍历之后得到集合中的每个对象,就是每个Y6值,另外每个对象中的属性给它得到,得到属性有多高,所以咱便利多个属性的数组得到每个属性,判断每个属性上边是不是有这个Di注解,有的话那把这对象就设置的进去,或者给它注入进去,最终把过程经实现。
05:28
另外过程中有一个细节,因为属性可能是私有的,咱需要设置一下,让私有属性允许进行设置,咱之前说反射中也特别提到过啊,这里边我们要特别注意。这是咱们特别提到的啊,我们说的这么一个过程,我这里特别标注一下,如果说你是私有的属性需要设置一下,它就是可以设置这个值。这个是咱们说的一个部分,然后下面按照这个基本的步骤,咱们一行代码一行代码来写一下啊第一步把map集合先进行便利。
06:07
Map遍历有多种方式,我就写一种最普通方式,我们加一个叫entry site,得到它里面这个key value这个。然后这里边把这个entr,我们给它做一个利啊,给他利一下啊。加上一个for each变历,然后便历过程中,它里边的。T。啊,就这部分啊,就是它的值部分应该在这里。咱起个名字就要这个。Entry。然后它的这个部分。这是我们的第一个啊,得到每部分就是它的KY的关系,然后通过它呢,看第二部分得到每个对象的Y6值,用里边的这个方法叫get y得到它的Y值,它的Y是一个类型,就叫这个OBD了啊,就是这个对象。
07:10
因为map里边我们看到啊,它的Y就是我们的一个对象,所以把它得到。然后得到之后我们继续往下来做,得到之后呢,因为咱要用到反射才能得到里面的属性,所以咱们的下一步操作获取一下我这个对象的这个这个部分,所以用OBG。啊Og.get class得到它当前对象,我们就把这得到,然后得到之后获取里边这个属性,啊,把属性得到。也就是这个部分。讲到这里啊。就是获取。每个对象中的属性用get declare,因为它里面可能有的啊,它都得到返回的是一个数组形式,我们叫。
08:07
第尔。然后得到之后看下一步操作,就是我写到第三步,就这部分我把它啊,咱都拿过来,然后一步步继续往下来写。来看怎么做啊,就是第三步我们遍历数组,这个就遍历数组。啊,咱给他做一个便利。我想这个位置啊,它叫field。然后起个名字,我们叫field,这个叫declare fields。便利得到每个属性,然后得到每个属性之后怎么做呢?第四步,判断属性上边是否有这个div的这个注解,那咱判断一下啊,这咱刚才写过代码是刚才不是Di,是注解,但是过程是一样的,Getno加上Di class。把这加上啊,加上我们这个注解。
09:01
啊,这个依赖给它引入是咱们写的这个D,最终返回的就是这个D。之后咱们做一个判断,我写一下啊。如果说这个annotation它不等于空,表示属性上边是不是有这个注解,有注解的话,那咱们就是进行对象的设置,但这里边还有一个特别的地方,如果你是私有属性,需要做个设置,要不然它不能设置值,咱给它设置一下啊,加上field.set size accessible等于true。表示啊,它可以进行设置,然后最后再把它的值进行设置啊,最后写一下啊。Field。Field。上方法第一个第二个加上咱们这个相关这个,那这我就从这里下啊factor get。
10:04
然后加上那个就是。这个值啊,应该叫build.get这个type啊,就是class最终完成这个设置啊,这里边应该有一常再加上一个开给头处理一下。所以我们啊,到这部分把它就最终完成了。而这里边呢,特别再把这步再特别说一下啊,Field set表示项里面设置值,第一个是它这个对象,就当前这对象往里面设置值,设置什么呢?表示它这个属性,因为它是一个,而这个属性你看啊field type什么意思,属性的类型,这类型,比如说我们是service类型还是什么Du类型,把它类型得到,通过类型得到它那个把它进行注入,就是在比如我在service里注入do,在里边注入person,把这个进行实现。所以以上啊,通过这个部分,咱就把这个。
11:01
BI的部分最终就完成了。这是咱们写的这个代码,咱们把步骤我们再看一遍。最终我们做个测试。大家看一下啊。首先在这个有参构造中加了一个叫load Di,然后在方法中第一步便利map集合,得到里面的每个value,就是它个对象,得到class,然后得到每个类中的属性判断上有没有这个注解,如果有的话,项里面设置它的值,比如说这么一理解啊,比如说现在你看。Switch里边是不是有do的属性,那我就根据它的类型找到它的对象,把它的对象进去,我这里写的就是根据类型找到对象,把它注入,因为咱是存到了b factory中。这个啊,咱们就完成,完成之后,最后咱们把效果试一下,看一下最后结果。这跟刚才那个漏的B类似,指它是属性这个设置,但是过程都差不多。
12:04
然后我们看啊里,我们用入了后用了法,我们做了一就是用出来了,然后这里边我们来到最开始的测试类中,咱给他试一下啊,看一下最终结果怎么样,我们做一个最终测试。大家看结果是不是输出了,DA是不是也输出了,证明咱们这个注入应该就完成了。所以以上啊,咱们就实现了手写此创架,完成了B对象创建,还有属性的注入,这个我们就讲到这里。
我来说两句