00:00
好,那我们下面咱们的工程咱们已经创建好了啊,那下面呢,咱们还是以我们之前咱们所写的那个三层架构呢,咱们为案例,然后来测试一下。首先呢,咱们把咱们的控制层来创建出来小com.at硅谷,然后点spring.controller。然后点。Controller啊好,然后在咱们就叫做user controller。行,然后呢,控制层创建完之后,咱们再来创建咱们的service的接口层,然后首先咱们这个先创建一个包啊。Erv,好,然后再来创建接口啊,叫做usererv,好啊行,然后再来创建service的实现类啊,ipl.u the service I PL。行,然后咱们来创建实现关系。
01:02
好,那设置完之后,咱们再来创建咱们最后一个叫做DAO啊,叫dao.u.DAO好,它是一个接口,然后再来创建DA的实现类啊,然后叫IMPL.user DA I m PR行,好,然后那我们把这些创建完之后啊,咱们把咱们的这个配置文件呢,咱们也创建出来。好,Spring的一个配置文件,然后这个咱们叫什么啊,比如说我们现在咱们是通过我们的这个spring-IOC,然后是通过咱们的注解来管理我们的病,所以说是spring-IOC-an nott ion on OK吧,好,然后这这个配置文件里面,咱们一会再写,把咱们的测试类呢,咱们也创建出来,然后com.at微博,然后点spring,然后点test,然后咱们叫做。
02:00
IOC对吧,然后by not ion,然后test好。然后呢,咱们写一个方法。贸易的行,然后大家注意啊,那我们现在呢,咱们要做的事情就是通过注解来管理病,那咱们有什么样的注解呢?就是说我们现在要想把咱们的一个类交给IOC容器来管理,那我们需要用到什么注解,大家看啊,然后在这咱们需要用到四个注解,哎,咱们直接来看咱们的笔记啊,然后这里面咱们用到的注解一共有四个,首先第一个叫做a component干什么的,将类标识为普通组件。什么叫组件?我之前也跟大家说了,我说咱们的IOC容器中,你看它的根标签不是BS吗?对吧?那BS里面是不是由多个bin组成,而每一个bin都是咱们IC容器中的组件,知道吧?所以说将类标识为普通组件,就是说我们加上这个注解并扫描之后,就可以把当前加上注解的这个类呀,然后来作为一个B被IOC容器来管理,知道吧?这个大家注意啊,好,然后下面还有it control干啥的?将类标识为控制层组件it service,将类标识为业务层组件it re peritry,然后将类标识为持久层组件,好,然后咱们从这几个注解的名字上,咱们就能够看出来它的区别,但是大家注意这四个注解功能一模一样。
03:33
也就是说呀,我们当前这个四个注解的功能都是将咱们的类标识为一个组件的,只不过就是它们各自的含义不一样。就比如说他对我,他对咱们程序执行的过程中。咱们程序执行的过程中,它们有区别吗?没有区别,但是对程序员来说它是有意义的,什么意义?如果一个类上,然后咱们加上了a controller,那我一看就知道这是一个控制层组件吗?如果一个类上咱们加上的有a service,那咱们就知道它是业务层组件,OK吧,好,大家来看,你看它有什么区别和关系呢?首先咱们的这三个注解上面其实都是用it controller it comp,然后来进行标记的,也就是说这三个注解其实是由它来进行扩展出来的,OK吧,好,这个大家注意啊,好,然后那所以说呢,大家看好,对于spring来使用IOC容器来管理这些组件来说,它们这四个注解有区别吗?没有任何区别,就比如说我们以后你在任何就我们在使用这些注解的时候,你把它给换成是其他的任何一个都可以,都没有任何问题。
04:44
OK吧,好,但是呢,它对于谁来说是有意义的,你看它是给开发人员看的,让我们能够便于分辨组件的作用,OK吧,你看到这个类上加了加上了什么注解,那它就是什么功能,所以说大家想想,你看咱们刚才创建的controller,那我们是不是就得加谁呀a controller注解,来,咱们来做一下,在这加谁叫做a controller。
05:10
OK吧,那我们当前咱们的service业务逻辑层,咱们是不是就要加a service呀?那咱们能加到这吗?大家说这是啥接口,咱们说了你加上注解有什么作用,加上注解就相当于我们当前加上注解的类,然后是不是在IOC容器中去配置了一个咱们当前这个类型的bin,那我们说过你一个bin的类型能是一个接口类型吗?不能啊,所以说咱们这个注解是要加到实现类上的啊啊a service。还有我们的DAO,在这来加上一个it repository,大家注意啊,好,那我们把这个设置完之后啊,然后呢,我们再来看,大家注意你看啊,然后在这虽然他们本质上一样,但是为了代码的可读性,为了程序结构严谨,我们肯定不能随便胡乱标记,也就说大家以后呢,也是要看准我们当前咱们的类有什么样的功能,有什么样的功能,咱们就要把它标识为相对应的组件,知道吧,当然如果它不是控制层,也不是业务层,也不是持久层,那咱们就用谁呀,叫做a comp,因为compo这个单词就是组件的意思。
06:20
OK吧,好,这个大家注意啊,好,那下面呢,我们把它给复制过来,放在咱们的笔记里面,大家注意,这是我们当前标识组件的四个注解,然后功能一样,只不过就是他们的名字不一样,这是让谁去看的,让程序员去看的,然后我们看完之后,咱们就知道当前这个类有什么样的一个功能。啊,这个大家注意啊,好,那行,那下面呢,我们这个注解已经有了,那下面呢,咱们就要来进行扫描了,怎么来进行扫描呢?大家注意,咱们需要在咱们的配置文件里面来扫描,为什么要扫描?也跟大家说了,你说我的类上加上注解,那spring不知道,那不百搭嘛,对不对,所以说我们一定要让我们的spring知道你的哪些类加了注解,又加了什么注解,所以说在这咱们需要来进行一个扫描组件,好用什么标签看好啊,用到了咱们的context的这个约束。
07:17
大家还记不记得这东西咱们之前用过呀,咱们之前在引入properties文件的时候,咱们是不是就用了一个property杠,Place holder标签?那我们现在需要用的是comp杠看,就是组件扫描的一个标签,OK吧,然后大家看啊,然后在这咱们是经过是咱通过什么样的方式来扫描的,叫做base package什么意思,是通过包来扫描的,它会将咱们包下面所有的类来进行扫描,比如说我现在我要来扫描的是咱们的控制层组件,那所以说我就需要来扫描控制层所在的包,叫做com.at,硅谷点spring.controller就可以了啊。
08:00
好,但是呢,我们不只要来扫描控制层啊,我们还要来扫描咱们的业务层,还有持久层,这个时候怎么办?大家注意啊,你可以这样写,中间加个逗号,再写com.I归属,点spring.service.i撇,因为接口咱们不需要扫描,咱们需要来扫描的是咱们的实现内,OK吧,好,那dau的话一样的在后边再加上逗号,但是你看这样会非常的麻烦,大家有没有发现,不管是咱们的controller也好,Service也好,DA也好,是不是都在咱们的com.ADD硅谷点spring这个包下。是不是啊,然后我们当前大家都知道包呢,它其实就是一层一层的目录,所以说我们当前的这三个包,它的前面是不是都是com.at硅谷点spring呢,对不对,那所以说我们可不可以在这直接让他来扫描com.at的硅谷点spring呢?可不可以可以,那这个时候它下边的所有的类,只要是在这个包下边所有的类都会被扫描。
09:04
再说一遍,因为包一层一层的包,其实就是一层一层的目录,一层一层的包含关系,所以说我们当前这些包在spring在这个包下面,那所以说咱们当前的这个包下面的类也都是在这个包下面的,OK吧,好啊。行好,那这个东西呢,大家那有老师,我可以写到spring,我可不可以写到come的at硅谷可以没毛病啊,那我能不能写到come也可以,但是建议大家写的稍微精确一些,因为你写的越精确,那我们当前咱们扫描所花费的时间就越短,如果说你写的越不精确,你写的范围越大,那大家说并不是咱们当前这个包下面所有的类都要扫描的呀,对不对。所以说建议大家写的稍微精确一些啊,还有呢,就是不要把包名起的太奇怪了,就比如说我原来有见过有同学啊,在设置这个包的时候,他看到那个什么买be提斯里面是org点阿帕奇点I be提斯,所以说他的包名也叫org点什么什么什么,结果他扫描包的时候写了个org上面都启动不起来。
10:11
因为它扫描的不单有我们自己写的内容,还有我们的以。org开头的第三方价包里面的类,所以说大家注意不要这样去写啊,所以建议大家还是写的要稍微这个精确一些的啊,好,那这就完事了啊,大家注意这就可以了啊,注解加扫描,注解加过了,这就是扫描。就可以了,不像是我们之前,咱们在这个里面是不是还要怎么地,是不是还要去设置各种并标签,让它的class去对应我们的各种类型,是不是啊,现在还需要这样去写吗?不需要了啊,好,那我们就可以来测试一下了呀,对吧?怎么测试?先来获取咱们的IOC容器,等于六一个可拉pass叉l application context,然后在这咱们把这个配置文件的名字给他拿过来,OK。
11:01
好,然后再往下咱们的loc,然后点叫做get b,然后咱们来获取什么类型呢?啊,我再说一遍,咱们的注解加扫描是什么意思啊,它可以将我们所扫描的包下面加上注解的这些类作为组件进行管理。什么叫作为组件进行管理?说白了就是在IOC容器中就有了当前加上注解的这个类所对应的并对象。能听懂吧,所以说我们现在是不是就可以来获取我们加上注解的这几个类的对象了,分别是user control.class OK,大家看在这咱们直接把它给输出,叫做user control,然后再往下ioc.get b,然后是user service.class有的老师你怎么用接口类型呢?之前咱们就说过吧,获取B的三种方式的时候就说过,然后在这咱们没有必要直接用谁,没有必要然后用我们当前这个B所对应的具体的类型,你只要是。
12:03
是它本身的类型也行,是它继承的父类的类型也行,它实现的接口的类型也行,知道不?所以说在这咱们用这个接口类型是没有问题的啊好,然后IOC,然后点叫做get b叫做user DAo.class。好。然后咱们在这儿来给他输出,那我们现在咱们来执行一下。如果说我们当前这三个对象咱们都能获取到,那大家说那我们的注解跟扫描,注解加扫描的功能是不是就已经完事了,对吧?那说明我们现在经过扫描,咱们加上注解的这些类确实是交给IOC容器来管理的,那否则你也不可能通过IOC容器来获取它呀,是不是啊好,现在咱们来一个执行,大家来看啊。啊,大家看一下,你看获取到了没有,获取到了好,那所以说那我们现在呢,就以注解加扫描的方式,将咱们的这些类呢,交给了IOC容器来作为组件进行管理,OK吧,好啊。
我来说两句