00:00
下面我们来看一下配置,并里边配置形式这个基于注解的方式。那么我们前面讲的这个配置B呢,实际上都是基于X文件的方式。现在我们来看一下这个基于注解的方式。在目前开发里边,这个基于注解的方式呢,的确还比较流行。基于注解的方式,我们从两方面加以讲授,第一个说使用注解来配置B,就是把这个B弄到LC容器里边。第二个呢,基于注解来装配B的属性啊,我让这个B跟B之间来发生关联关系。OK,我们先看第一个。我们要是想把一个bin加上一个注解,然后就放到IOC容器里边的话,首先我们需要来看一个叫主件扫描。能够从class pass下自动扫描、侦测和实例化具有特定注解的主件。哪些注解呢?这样的一些componenty service跟control component基本注解。
01:12
标志了一个受spring管理的组件。Reportsy建议标识在持久层,Service建议标识在服务层或者业务层,Controller建议标识在表现层,那实际上这四个注解呢,目前这个里边是可以混用的。因为LC容器没有办法识别到你这个类。是一个持久层的,还是一个表现层的,所以说可以混用G,我这个controller可以去标识持久层,反过来我这个service也可以用来标识表现成,虽然是这样是吧,但我们依旧建议大家按照我们这个,呃,持久层。表现层跟这个呃,持久层,业务层跟表现成这样的顺序来进行标识,因为这样式的话呢,我们看起来会更加清楚。
02:05
对于扫描到的组件,Spring有默认的命名策略。使用非限定性类名,第一个字母小写啥意思嘞?比方说我有一个类叫U。Service,那么它对应的那个B的名字LC容器里面那个名字第一个字母小写U。Service的意思。那么我也可以在这个注解里边,通过这个Y6属性来指定这个名字是什么,那什么时候需要指定呢?比方说我这个叫U的service,那这个时候通常情况下我需要指定它叫。Service。听到了吧。啊,如果本来我这个类的名字叫这个service,我没有那个接口的话。那默认那个名叫user service,我就不用指定了,那如果我有一个接口,就如说我这个user service啊,是一个接口,因为一个实现类叫user service in input,这个时候我们通常指定它的这个名字叫user service,那个input的话呢,就拿掉啊,这是一个习惯,你当然你就是用这个user service in也没问题。
03:16
OK。不解呢,说完了,现在我们再看,我们是不是把这个不解加到这个B的上边了,那这个B。就可以被LC容器管理了呢。啊,还差一点。还差一个。我们需要来配置一个context component。什么意思呢?就是说我需要来配置我扫描哪些包。Context comp sc啊,它有一个base packet属性,它指定了一个需要扫描的鸡肋包,Spring容器将扫描这个鸡类包以及子包中的所有类,什么意思哈,比方说我现在呢,我有几个包啊,我每个包上边的这个类啊,我都使用这个注解标识上了。
04:09
然后呢,我配置了这个,呃,Component干这个component干只扫描群的一个包,那我这个时候LC容器我就只管这个包下的水有病,而其他的这个包我就不管,那这边有一个前提,就是其他包并不是我标识这个包的子包。这样的一个意思清楚吧,我们一会通过代码的话呢,再进行说明,这里边既然我们需要用到这个component scan的话,这意味着我需要导入context这个命名空间,好当需要什描多个包的时候呢,我们可以使用逗号分割。OK,以上我们通过代码来看一下。新建一个包。
05:01
这个下边的话呢,我们来搞一个类。比方说。Linca object。等一下这个上边的话呢,我来加一个注解叫艾,嗯。Poland。OK,这个注解加上了呢,现在这个。B是不是被LC容器管理了呢?还没有是吧,你看我们这个上面的话呢,还没有这个S这个小标签还没有被管。我一会儿嗯,我配置一个contact component干才可以,我再来建几个词包哈。建一个紫泡叫po。我们来先来写一个接口,叫U。
06:05
写一个方法。提供它的一个实现类。Noodles。Service import的私有方法。Service,这个service呢,我直接来写一个类。Yo。Service。解一个方法。
07:09
The。With。的爱好了,这个时候的话呢,这个主段之间的这个关系,我们回头再说哈。下一个谁来建一个controller?这个里边我们来搞一个叫。User。Public。Excuse。Put。Control the。OK。现在的话呢,我们来添加注解。
08:00
这个注解呢,已经加上了有的controller啊,我们说这个是这个模拟这个表现层的加一个at。抽了再来。有的repository,这是个什么?这是一个接口,这个注解呢,我加到这个实现类上面,这个是模拟那个19化层repository。一下。加上。User service。你六层四位。然后再来创建一个新的配置文件。Yes。SL。代步就要注意导入contact命令空间,看到了吧?这个是我们这个ecl spring插件帮我们干的事。Finish。
09:05
指定。Spring IOC容器扫描。好的,下边的话呢,是见证奇迹的时刻,我们看。这几个类。现在都没有那个S标识是吧。Contact的component scan。Package按点找到,所以我搞一个保存大家看。是不是有了啊,这个接口不是测试一下。全前面讲到了是吧,那我会扫描当前的包跟当前包的子包,所以说这几个加上标识的都被纳入到LC容器里边了。Bin。
10:01
先搞一个guest,先搞application context机。等于。六。拉。Us。Application context。His。No patient at now。下边我们来看。Text object有等于CDX点艾bin,他说这个bin ID叫什么呀?第一个字母小写叫test object。Out you。Controller。U。Controller。等于CDx.T这上面那个情况是一样的第一个字母。
11:02
小写的U。Pen po到了吧?来第三行是不是有点controller,再来。下一个呢,叫upoypoy接口类型了是吧,等于CDX点带B。默认情况下呢?这个名字应该叫。Upoy还是叫Y啊?看一看这个标识吧,是吧,我们是不是没有指定这个名字啊,这个名字应该叫upoy in,咱指定一下,指定Y6值等于这个Y6值是什么呀,不默认的呀,可以直接写u report。对吧,我们还是用这个名,比如说C。
12:00
拿过来。按一下。上面再来搞一个user。等于。User service you see can ADD in。Order service。You。Service。等一下。Set out you service。Service。好的。找一个瞧一瞧。我们看到。这样的四个B是不是都能出来呀,啊,这就是我们。使用注解的方式来标识bin,这个bin的话呢,已经装配到LC容器里边了。
13:04
现在呢?我们翻过头来看我们刚才都干了什么哈。我们首先呢,我们需要在我们这个bin上加上对应的注解,比方说test objects这边加的是a component,然后controllery跟service,然后我们需要来配置一个。呃,Context component scan,这意思是什么意思呢?我将扫描当前这个包,以及当前这个包的子包,那所有标识注解的那些病。豆浆。被IOC容器进行管理。但这个注解指的就是我们的component service以及controller。OK,下边的话呢,我们详细来说说这个context,那它除了可以指定这个base package以外呢,还可以来指定一个属性,一个属性叫。Resource pattern叫什么叫资源匹配?我们可以使用这个resource pattern属性来过滤。我们只扫描指定的类。
14:09
调一下。比方说我这样写resource pattern,我只扫描啊子包下的星点。Class也是可以的,这样写完之后的话呢,注意到什么呀,我就只扫描能够得到这个,呃,U reporty,前面那些就得不到了。试试。找一个。大家看这个时候会抛出一个异常,他说没有一个B叫test object,那我把上面这些都注掉。只留一个PY来看。是没问题的。
15:02
可以通过。Resource。指定扫描的资源。那我底下这个的话呢,我先助教,因为复习是吧,这个呢给大家留着。拿下来。这一行的话呢,拿过来去掉了。嗯,除了我们指定这个resource pattern以外呢,这个content component干还可以指定。以下两种类型的子节点,一个叫include filter,包含哪些目标类啊?C include filter排除哪些目标类?你值得说明的是。
16:02
Content component sky下边可以拥有若干个include filter,或者是include。那。我们这个include filter跟ex include filter下边是可以放一些表达式的,有五种类型,常用的第一种和第二种,第一种根据AOC指定我包含哪些还是呃,排除哪些。第二种assignable,根据具体的类名或者接口名指定包含哪些,包包含哪些或者是排除哪些。我们先看这个not吧。哎。Context。不包含,不包含谁呢?比方说。我们说。不包含这个。Posy。这个。它不包含。不包含它clc。
17:03
放上来找一个看看效果。不包含什么样,根本就没有一个B的名字叫优。Poy这个时候的话呢,我可以把上面这些打开,上面这些都是没问题的。看到了吧,没问题,我这个异常呢,还是找不到这个usery,但是我的test object啊,User controller啊,User service啊,都是没问题的。是吧?我们再回到这个里边来,这是我们说的这个叫exclude filter,不包含什么。一个节点。这个节点。指定排除。
18:00
哪些?指定。表达式的。排除第一种方式的话呢,我是根据。那既然有排除的话。这样不行啊,这个。Ctx我就应该会有包含呢,比方说我说我只包含。这个Y其他的不行。我只包含他,其他的不行。好的。我只包含他,其他的不行。那我把这个的话呢。都打开了哈,再看。我发现都有。诶,咱不是说了吗?是吧,不是只包含他其他的不行吗?那我为什么加component controller跟service的也有了呢,我们这块啊,想做出这个效果的话,我们还需要配一个属性,这个属性叫使用默认的filter,默认情况下这个是是true。
19:19
就是说我要扫描component controller service跟PY。那我现在的话呢,我把这个值设为false。这个时候他就不再使用默认的filter,而只使用我这个include filter include filter指定的这些缸,Component,懂这个意思吧,找一个大家看这个时候这个效果就是说什么它没有一个并叫test object,因为它什么它只包含这个reposory,我把这些注掉。你看。
20:00
这个是OK的。这个是OK,好的。加一个注解。The context。Include。Filter。有点点。指定包含哪些?表达式的主见。包含。开子节点。需要。Before the filters配合使用。好的。我们我们第一个方式的话呢,我们用的是AOC,下边我们再来看一下我们这个。
21:03
Sustainable就说我们使用类名的方式。哎。Context。不包含什么。我只用assignable的方式。不包含什么,比方说把这个接口拿过来。我们说哎,我就不包含这个接口,以及这个接口所有实现类的。现在我把这个打开。大家再看。有。这也没有是吧,为啥嘞。我是不是得把这个先去掉啊。来。嗯,看前三个是没问题的,这个时候怎么了?这个时候呃,有的posy没有对吧,确实是没有吗。
22:07
再来。我们再看。最后一个。Contact歌。Include包含什么呢?我只包含它。Sable。哎,我只。我只包含这个。CTRLCCTRLV,那当然我这个属性呢,需要加上。Use default filter。等于false。好,只包含他,其他的不行。先找一个瞧瞧。这个时候抛了一个异常,说test object没有,我把这些给他除掉。再来。
23:01
看到了吧,这个时这个u report是可用的。行了,那以上的话呢,就是我们讲到的如何在LC容器里边通过注解来配置B,但是这个。主教之间的引用关系的话呢,还没说这个,我们下节课说,嗯,本身去加注解的话呢,其实这个并不复杂,这里边唯一一个需要注意的就是我可以通过Y流属性值,Y流是一个默认的属性啊,我就可以不写那个外流属性来标识这个B在LC容器里边的这个name或者是ID name和ID是一回事。然后我们详细的讲了这个context component scan2个属性啊,Base package跟use default filters以及。呃,两个子节点。嗯。Include include filter,并include filter,那这里边的话呢,我们可以指定a not,还可以指定aignable,还有一个属性叫什么叫resource pattern。
24:03
OK。
我来说两句