00:01
现在设备指称我已经把它加进来了啊,那么设备指这个概念,我就把它就就就过去了啊,下面我们再接着看。下面我们一起来看一下LC。看RC之前呢,我们首先要给大家介绍一个概念。第一个概念。呃,呵。或者叫依赖。依赖,依赖这个词语是什么意思呢?依赖,依赖就是指的是谁离不开谁,这叫依赖。啊,你离不开你的女朋友是吧?你女朋友离不开你是吧?你这叫依赖。那在我们系统当中。在我们一,在我们系统的每一个层之间,层与层之间也存在依赖。比如说我们来看这个图。我们的controller层,它必须依赖于设备支撑。比如。比如现在我把这个service你看山。
01:03
我删掉了。我们的里面就报错了。看到了吧。那就报错了,也就意味着。下面这一层。假设有问题,是不是会影响到上一层啊,那是不是是不是说明上层对下层这个有依赖啊,Ctrler层对我们的支层它是有依赖的,好CTRLC再恢复过来啊。好,就这样子,这是存在依赖的。同样的道理,同学们。我们的色子层是不是依赖于do层啊?因为你看我如果把do。IP,我把这玩意儿删掉。那你看一下service service里面就不对了,对吧,那就报错了。所以呢,层与层之间它是存在耦合的,层与层之间是存在依赖的。依赖啊,指的是。
02:00
某某某。叫离不开某某某。啊,这是叫依赖。好。那么。我们在软件系统当中啊,在我们软件系统中。啊,层与层之间。是存在依赖的。我们也称之为。我们也称之为耦合。啊,我们系统架构或者是啊设计的一个原则是。叫高类聚。第和。啊,咱们很多同学上大学的时候学软件工程,经常会听到这个名词,但其实大家并没有真正理解它的含义。啥叫高利聚,啥叫低耦合,高离聚就指的是我这个层当中,我这个层的内部的代码,我应该是高度的聚聚集的。但是我当前这一层和其他的层之间应该要尽量的是耦合度要降低。
03:04
好。层内部的啊,内部的组成。应该是高度聚合的。而。层与层之间的关系应该是。松耦合或者叫低耦合的。低耦合的。最理想的情况。最理想的情况是零偶合。就是没有合嘛。啊,就是没有耦合,这是最理想的情况。我以前我以前做过一个系统,同学们。我们那个系统啊。啊,我们那个系统有差不多有20几个模块。我们最后把模块和模块之间的这个耦合度啊,做到了零偶合。就变成什么呢?这个系统是叫可定制化的。这个系统有个叫基础版,基础版卖给你,比如说这个系统20万。啊,你这个你这个企业你只需要基础版的功能就可以用了。
04:02
当时我们还没有用注解,当时我们用的是XL。啊,那么我会我们我们程序员我们自己写的一个页面,这个页面上就罗列了当前这个系统有20几个功能,大家想象一下,这20几个功能是一个列表,前面会有一个复选框,你把哪几个打勾,这几个打勾最后会自动的给你生成一个新的项目。这个新的项目就包含了里面的源代码,就包含在里面啊,也包含了这么几个功能,然后就可以发布,发布,然后就就就可以输输出给你。这个叫可定制化的。啊,这和具体的功能实现是没有太大关系的。啊,能够做到这一步,其实说实话是非常不容易的。啊,这个叫第二和。啊,甚至于做的叫零偶合。好,咱们长话短说,再回到我们主线上来。所以现在我就需要做到什么呢?坦白的讲啊,咱们最最简单的理解,我现在既希望能够做到service MP,我删掉,我肯的不报错。
05:04
刚才是不是爆红啊?我希望能够做到service MP删掉了,可觉得不报错,Service MP里面有代码也改动了,我不会影响我们上层。下层的改动不会影响到上层。那我们怎么来解决这个问题呢?所以我们就来看一看为什么刚才会爆红,我们看一下CTRLCTRL当中是不是是是不是也六啊。六出辅路的设是m po,你这么去六的话,不就表示和下层的设备是m po就有关系了吗?那你说老师简单等于now。等于呢,你再删MP,它就不报错了。确实他确实不报错,但是你也运行不了,它是会空。他为空,那不就空指针了吗?这定的方法不就空指针了吗?是吧,同学们。啊,但是你不得,但是说实话改成那是对的,这是我们第一步。第一步先把这个等于六先删掉,我们先改成等于,那先让他不报错,第二步我们我们再去思考,我怎么来解决这个空指针的问题。
06:05
我怎么去解决空指针的问题?好。我怎么办呢?好了。看我的操作。这是我的配置文件。好,我在这个里面。我写个病标签。ID等于float do。Class等于。Com点,艾特硅谷点,Float点。呃,弗洛点点点点do点点。我又配了一个病,这个病是咱们配的CT上面的是吧,我这边又配了个病。再来并ID等于。
07:03
Flu service。Class等于com.at硅谷点fruit.service。我这边。是叫吧,还是叫BZ啊哦,我叫的是BZ是吧。我写的叫BZ,嗯。叫比亚迪其实也行啊。要不我改掉吧,有点强迫症啊,我改成叫B,把它改成叫service行不行,同学们。好,我看一下啊,Preview我看一下啊。要修改就是有些地方有有改动。没问题啊,那应该没问题行。我改改过来了啊,把它改成叫service行吧,同学们啊,改成叫service那行,那我这边我就直接写了service.mp.float servicep没错吧。来,这是我第一步写的标签,老师,你写的标签想干嘛?我的想法是这样的,同学们。
08:01
我在当前的这一份配置文件当中,我配了三个病。我配置了三个B。这三个病其实就是对应的三个组件。下一步我计划在我们这个系统启动的时候。他就会把这三个组件准备好。放在一个容器里面,把它准备好。谁想要的时候,我就主动给谁。我想来做这么一件事情。好。现在。我回到这个里面去,我要来写一些代码。在这边我来新建一个叫接口叫冰。Factory。冰factor经常看到这是一个冰工厂吗?冰工厂是吧?咱吃的冰棍是吧,冰工厂。他提供一个方法。他提供一个方法,Object。
09:00
Get。子俊ID。根据ID就能获取到某一个病对象,根据这个ID就能获取到后面的对象,大家能听懂吗?我就想实现这么一个功能。这叫b factory。再来。下面我要对他,我要来写实现类。接口肯定不能工作,我得写个时间类,所以我在这个地方我来写一个。叫。Class。X。U。Context。别扭,这个xman应该放前面吧。不像,应该是class pass X ma application,戒掉吧。我写的这么一个类。我让这个类去实现b factory。那你就需要去实现它内部的一个方法,没错吧,你就需要去实现这个方法。那么实现这个方法。
10:01
我说了,我需要一个map容器。Private。Private private map。Object。Map等于new哈希map。那么这个get b方法怎么实现呢?不就是b map.get把ID放进去吗?是吧,同学们,那重点是不是就是这个map。容器啊。大家是不是感觉有点似曾相识哦?我们是不是这一堆代码已经写好了?我们其实已经放在这里面已经写好了,现在我需要把它拿过来,那这个我要把它删掉了,看好了啊。这个我把它删掉了。我这边给印尼的初始化。这个初始化里面一大坨。剪切。我剪切掉了啊。剪切了之后。我把它放到这边来了。
11:01
Public class。Pass。X application,我把它放到这里面。把它粘进来了。我们先来看一下。第一步先去加载我们这个配置文件没问题吧。Application X先加载它。然后呢,Document factory再往下document build再往下pass,得到一个。然后我们去一步一步解析,一步步解析,最后把这个扔到冰里面去,没错吧。全部塞到这个冰B里面去。那这个地方呢,咱们写的叫controller b class,这个名字我得把它改一改了,同学们。因为已经不再仅仅是control了,是不是啊?我们应该是。Controller层、service层、D层都称之为叫model病。都称之为叫加法并模型嘛,模型组件嘛,控制层的这个叫业务模型嘛,啊控制器啊,这个叫service,叫业务模型,D务层叫数据访问模型是吧,同学们。
12:05
所以这些都属于Java病。那这个名字我把它改掉,我就称之为叫b class。这个是b class。New instance。然后把它扔进去。没问题。那么经过这个构造器,我这个BB里面就有数据了,有数据之后,我这边get就没有问题了,没错吧,好再来。那你这个dispatch。是不是就就就就就不对了。这边代码被我删掉了吗?看看他哪里报错了,是不是这玩意儿没有了。是吧?冰map,他没有了。他不能再通过冰办法去获取了,但是没有关系啊。我是不是现在新创建一个叫bfi的接口啊,我是不是只要用接口的这个get方法不就可以了吗?对吧,那其实它是它的实现类,所以。我们,所以我们在PA里面。
13:04
Private。并factory。Factory。然后在这个初始化的时候。Factory点。等于六。Plus pass xm application。是不是?然后factory。点get。他是不是一个叫get b这个方法呀。啊,是不是啊。盖的改一下。好了,这样就可以了,其他地方他就没有报错了。啊,我们就做了这么一个小的改动。OK。再来。现在我们再次回到,我们再次回到,稍等一下啊,再次回到去了。那么controller这边有个service,稍等一下啊,这边有个service。
14:01
Dis里面我们通过get并这个方法,我们可以得到一个CR的对象。啊,可以得到一个C的对象。但是同学们。CT这个对象。它里面的这个service,它是等于,那我怎么给它赋值呢。哎呀,这个service我怎么给它赋值呢。再来。社会支撑。Service。这个service里面需要位。这边是不是也有耦合?You know。先把这个耳合,先把这个依赖先去掉。那这个地方IP是不是就不需要导入了,删掉。Control里面。Service的IP是不是也不需要导入啊?现在肯定是不行啊,你改成那肯定会报错。我怎么解决这问题呢?这是不是属于层与层之间的依赖啊?
15:00
我们在配置文件里面。第一步,我们先描述我们需要哪些组件。第二步,我们需要去描述组件和组件之间的依赖关系。所以这个service它里面需要DA,我就不再把它写的标签,我写成双标签,然后在这个当中我写一个叫property,也就说老师property是什么意思,我瞎写的。Property为什么叫property单词?因为这个单词的意思叫属性嘛。也就意味着这个病里面需要一个属性嘛。那我这个service里面需要什么属性啊,是不是需要DA这个属性啊。那行。回到这边来。Name等于。Fruit if老师,你怎么又写了个if这什么东西啊?Ref叫references,这个单词叫引用。啊,应用里面我写个flow的do,这个flow的do和上面这个flow的跌污是对应的。我的想法是这个ref属性里面这个值啊,它要引用某一个病的ID。
16:05
然后这个name属性,我的想法是name属性它指向的是这个里面的某一个property,它的属性名叫flu。好。把它写在这。Property标签。用来表示属性。Name表示属性名。Iff表示引用其他病的ID值行吗同学们?所以这玩意儿如果改成A。这还对吗?这个是不是要改成A?这个要不要给他A。为啥?它是不是取决于这个里面的属性名字哦,如果你这玩意改成B。那你这边是不是要改成B是吧,同学们,当然我们不要这么去命名,这么命名人家都看不懂啥意思啊,行,再撤销一下。
17:07
好,再回到这边来。哎,是在哪个里面,在service里面。在这里面。好,撤销一下啊。所以他们之间的一代关系,Service和do层看一下啊,看图和do层之间是不是一代关系,我就建好了。再来。Controller和service之间是不是也有依赖关系啊?这两侧之间也有依赖关系。所以。再回到CTRL里面去,这边有service,那么我们需要配置一下,也就是当前这是不是CTRL了。把这个带标签,把它先恢复成双标签。然后是不是需要写个property。Name等于service rf等于fruit service。我就把它写成这样了。好。这个猪是删掉了啊,不需要。这样,我不仅描述了我需要几个病,而且描述了病与病之间的依赖关系。
18:03
全部在这个配置文件里面进行了描述。那么下面我这个里面,我这边的解析是什么?这个for循环的解析叫获取所有的并节点在这儿。然后根据每一个并节点是不是会创建出一个obj对象。然后把这个obj对象是不是扔到这个map里面去了。好,我这边加一个注释。创建。并对象并实例。这不是。将并实例对象。啊,保存到map容器中。对吧。此处到目前为止。此处需要注意的是。病和病之间的依赖关系。请问现在有收入吗?还没有设置。
19:01
是吧,同学们,我这波是不仅仅是通过反射得到每一个病对象啊,把这些病对象全部保存到这个容器里面,但是病和病之间的依赖关系我还没有给他设置呢。所以我在这个位置,我需要再来一个for循环。第五步。我看一下啊,当前我应该是在1.7里面加的写的代码啊,应该没问题啊OK。所以,我需要再来写个第五步。啊,第四步是创建每一个病,第五步。组装。并之间的依赖关系行吗,同学们?组装并之间的依赖关系。我们来试一下。怎么写呢?一样的。这个是below the list,我们一样可以用。那么我得写个负循环。拷过来。啊,拿到每一个并漏的list,拿到每一个并对象,也就是element稍等啊,代码拷一下啊。
20:04
Load if element ID这边都都可以拷拷贝啊。You拷过来。好,把它代码补补好了啊,补个大括号好没问题。我把这个配溶剂。把它放到上面。把这个最小化。把这放下面去了是吧,稍等一下啊,把这玩意先删掉。我把其他的全部删掉。然后再回到配置文件,配置文件打开。然后用它。再写一下行,这样我就可以关掉了,好一个方上面,这样大家好看啊,能看得清楚一点。我们直接看一个就可以了啊。回到这儿,就看这一个。行,同学们看着啊。我现在拿到一个element,是不是拿到一个并element是不是就拿到这个对象。我上面这个for循环是不是已经把每一个病全部都组,全部都把它产生了,并且保存到脉粉里面去了,对吧?我这个for循环的目的就是想组装并之间的依赖关系。
21:11
所以我拿到这个,我需要去读这个element,它里面的property属性。如果他有pro属性,我就要去组装,如果没有那就无所谓嘛。所以这个兵element我拿到了。好看好了啊。并element。是不是就是他?那么这个property是不是属于病的子节点?能听懂吗?这个病里面有几个直接点呢?不好意思,你打错了啊,他有三个。这是第一个。这是第二个。这是第三个。啊一和三我们可以认为叫空白节点,或者叫文本节点。啊,所以说它有三个子节点,其中有一个property,是不是元素节点啊。
22:05
element.get漏子。好获取它的直接点,Load the list。叫冰。Load list,我们把这玩意的长度可以打印出来看一下。打印冰拆load.gets行吗?同学们把它长度打印出来看一下啊,是个断点。好,其他的咱们暂时先暂时先不管它,我们把这个程序启动起来,看这个打印出来到底到底是啥。现在这个项目我看一下啊,我们配的应该是他是吧,没错啊。行启动一下吧。
23:05
好,进来了啊,到这边来了。我们直接看一下这个这个对象打开给大家看一下啊。是不是有个叫冰?Load list是不是给集合啊打开。它里面的。这是个集合。我们看一下啊。他的name稍等一下啊。First child。或者看这个啊,看这个对象,看这个冰A的这个对象啊。当前他是病,没错吧?冒号后面是什么呢?冒号后面是它的value值,是它的这个load value。我们的是元素节点,元素节点是没有load value的,如果是文本节点啥意思呢?这个是咱们XL的一些基础知识啊,我顺便给大家介绍一下。比如说同学们。比如说啊,比如说我写了一个,我写了叫S。
24:02
好,同学们。就光看你不要看其他,就光看这句话,这句话有几个节点呢。千万别以为是一个我记住大家要说一个。有两个节点,第一个节点叫SM节点,它是元素节点,还有一个节点叫是什么叫文本节点?我们这是个接口,它表示节点。然后呢,Element是它的子,是它的子接口,叫元素节点,我们还有什么呢?叫text啊,这是文本节点,能听懂吗?啊,这是它的一种基基础知识啊,反正提到了咱们就说一下吧,我把它写在这啊。所以呢,对于元素节点,它是没有这个叫load value,所以它显示的是now,能听懂吗?那对于文本节点G的load value是不是就叫Jim?啊,所以如果是文本节点,它后面冒号后面就有值了。好吧,同学们行。所以你这边看着浪不要觉得很奇怪,不要以为是错的,他不是错的啊。
25:02
往家走。这个里面,嗯,这个里面能不能去看它的子节点哦。这个子节点还真不好看啊。你看这样,这边有有有显示啊。Next sibling。啊,这个叫井号text,这个井号text指的就叫文本节点啊,杠N表示一个换行符啊。First,这个还真不大好看啊,那就这样吧,打印出来算了,把这个纸打印出来啊。怎么找到控制台呢?在这呢啊。好,把这边全部清掉,我们看这玩意点打印出来是多少。是零啊,是零就不对啊,为什么不对呢?正好碰巧了我们解析的第一个X文件,看一下啊。第一个病。里面有子元素吗?没有吧?哎,是不是同学们第一个B里面哪里有property没有吧,没有的啊行再来再继续解析。
26:02
继续啊。再点一下绿色的,再回到这个断裂这个地方,是不是现在到第二个病了,没错吧,到第二个病咱们再来看一下。啊,这个叫element。你看一下。First China。是不是有了第一个第一个孩子节点,他第一个孩子节点从这开始。一直到这个位置。行不行?这属于文本节点。所以我们可以打开first,打开你看data是不是叫杠N,然后加了一个空白啊。啊,准确的讲应该是这啊这边都是空白。就这样的。啊,都是空白的东西。那行。你再看下一个叫next evening第一个子节点的兄弟节点,也就是这个子节点和这个子节点再和下面这个子节点,这三者是兄弟关系。都属于病的子节点嘛,所以它的next s你看一下,你看是不是叫component是什么。Common是什么叫注释?
27:01
是不是就是我写这个pro注释啊,所以你可以把next兄弟节点你看这有。你看后面的这个property标签用来表示能看到这个弹出的框吗?大家屏幕上能不能看到,就是我这边屏幕上它有我鼠标一放上去它有个提示。大家能看到啊,能看到就好好。叫com的property标签用来表示属性,那表示属性名,RF表示什么引用,那不就是我写这玩意吗?对不对啊。那这个还稍微有点小特殊的啊,这个还稍微有点特殊,当前这个病里面有几个子节点,这第一个。啊,这第二个。哎,这第三个。这第四个,哎,这第五个是吧,同学们,它有五个直接点。啊,行吧,同学们好,直行过去,所以打印出接着舞。是不是再来?下面一个。这玩意儿有几个直接点。那就三个嘛,执行过来直接打印了行吗?同学们直接打印,你看是不是就三个行这个概念说完了啊再来。
28:01
我把它停掉了啊,再继续啊。把它最小弯回到这边,来来接着看啊。所以我这边兵拆的漏的,这就打印我就去掉了啊。好,再来。这个兵the list,比如说我们就以它为例啊。我们要开始负循环。Four。当然这边得使用J,因为外面已经有I了。G小于。冰load list.get n,坚持一下啊,把这个讲完之后,大家反正还有时间点外卖啊,现在应该来得及啊,先不着急。负循环应得借等于零,借小于他。J加加行并拆load list.item是不是取到其中一个,注意我如果咱们同学要敲这个代码的话,请你这边写J啊,已经以以前有同学写I的啊,结果代码不报错,但就是出不来啊。
29:01
我们写一下road,冰拆load等于它。拿到一个节点,那么同学们,请问我要不要关心这玩意儿?不要吧,我关心的是不是这个。行,所以我这边做个判断。If load.get load type等于等于。load.element load是不是保证你是元素节点?并且。并load.get load name,如果你是元素节点,是不是有load name?好点,Equals。点。没错吧?啊,如果你这个元素的这个节点的名字等于property,我才关心的啊,你写其他的我不关心。就这样。好在这个if里面,这样我们就把它强转一下element。Property element。好,把它放到这儿。
30:02
好得到一个元素,那我是不是就可以取出name和取出ref啊取一下。Probably get attribute。好,第一个取出name属性。子俊。Property name等于。第二个,我得取出ref的属性,String ref。If。Ref等于。好。或者叫property if。I。等于property element get attribute。Property element。Get attribute。I。是不是?行,再来。同学们,我现在已经拿到这个值,拿到这个值我下一步你猜我要干嘛?我是不是要根据这个iff这个值。找到那个对象。然后给这个对象的这个属性赋值。
31:04
是吧,同学们,所以我在这边写一下。找到。Property if。对应的实例。这第一步。很简单,从冰里面找不就完了吗?Get。是不是啊?Object reo BG等于它。第二步。第二步,将refo BG设置到。病啊,当前设置到当前病。对应的实例的property属性上去是吧,同学们我们要把它设置上去,所以我需要拿到这个B对应的实例,那我这边是不是有个BID啊。我把这叫剪切,现在我把这句话我再放在,再放在这外面啊,再放在这边来。
32:01
那么。稍等啊,把两句话对调一下,那这样这个冰ID是不是也可以从冰里面去取啊。因此在这边。冰。map.get好,把我们这个BID把它放进去,这样我们就能拿到这个并对象并obj。这一套。拿到这个对象,拿到这个对象之后。我就需要把ref fobj设置到并obj的。Property属性上去。能反应过来吗?所以我肯定要用用到反射。肯定需要用到反射。并。o.get class先获取它的大class对象。病class等于他。然后并class.get declared field。我就不想通过set方法获取设置了,直接获取它的属性。
33:00
Get,这个是什么?是不是就是我们的property?是不是啊,这样我就能拿到这个field了。A property field。拿到它之后,是不是就直接给它复制就好了。咱们先稍等一下啊,这边抛异常啊。好,先把一张抛在这啊,再来。Property field。点set accessible to是不是改成强制访问呀?然后property field。点set。某个对象并obj放进去。然后把我们的。哪个是不re eo BG啊?没错吧,把它设置上去。写完了。好,这样我们就把它搞定了。
34:01
那这样的话。啊,我们回到controller controller里面这个虽然我们这边写的等,但是我们不用担心它。我们不用担心。因为我们的class pass application里面在解析的时候,是不是已经把我们设置进去了。好,所以这边虽然我们写的等于now,但是它不会报制帧,再来service里面,虽然我们这边写的,但是它也不会报控制帧。没错吧?行,再来。好,快结束了啊。再回到dispatch里面去啊,Dispat。我们的BFA在这。呃,这是在初始化的时候,咱们定用的下行没错啊,对的。现在我们再来启动一下试试。
35:17
那行,你看它也是没有问题的,下一步下一步对吧,他都是可以的,我们新增一个吧。萝卜2022。单价。八块88。叫。啥玩意儿听不懂。添加一下。好点一下五一,哎,这样我们就能加进来了,没错吧,确实是可以的,OK。好,这边这边也没有问题啊。好,现在呢,我这个代码呢,功能我已经把它实现了,但是我还没有给大家总结。啊,一会儿咱们再来总结,我再把里面的代码再给大家再总结一下,我们需要总结出我们所谓的叫稍等啊,我们的read me在这。
36:04
啊,我需要给大家总结出。我们称之为叫,呃,称之为叫。Joel。控制反转。还有一个叫依赖注入。我们需要解释一下这两个名词啊,控制反转我们称之为叫LC。依赖注入我们称叫叫dependency injection injection叫注入啊,Ency依赖吗?依赖注入我们需要解释一下这两个名词,先不着急啊。
我来说两句