00:00
我们再来说一个底层铸解an condition呢,按照这个英语翻译过来就叫按照什么条件,也就是我们说的条件装配,指的就是当我们满足an conditional指定的条件的时候,我们才给容器中注入相关的组件,或者我们要干相应的事,然后呢,An conditional它呢还是一个根注解,它下边呢,派森了非常多的这些注解,这些注解的这个功能呢,我们可以来看一下an conditional来确认一下,我们在这一块找到我们这个ant conditional这个注解,这个注解CTRLH打开了寄承数,哎,它有非常多的派thon注解,那每一个注解呢,都代表不同的功能,我们点,我们找几个具有典型代表的,比如conditional,嗯,Being应就是说当容器中存在我们指定的这个be应,也就指定的这个组件的时候,我们才干某些事情,相反的就有一个condition的啊,Miss being,当容器中没有这个组件的时候,我们才干某些事情,然后呢,接下来还有一个condition。
01:00
Al,比如我们这conditional on class,当容器中有某一个类的时候,我们才干某些活,还有conditional on missing class,当容器中没有这个类的时候,比如我们才给容器中注入某些组件,还有我们这个condition的on resource,当我们这个我们这个项目的类路径里边存在某一个资源的时候,那才干什么,还有conditional on Java,当我们这个是某一些指定的这个Java版本号以后,那才干什么,还有conditional on web application,那当我们这个应用是一个web应用的时候,那在干什么和当我们应用不是web应用的时候在干什么等等等等一大堆这样呢,这几个老师列举的都是我们常见的这些属性,我们后来可能在spring boot底层也经常会用到,还有这个condition的啊single connect这个呢,就是代表当我们这个容器中指定的这个组件只有一个实例,或者它有多个实例,但是有一个东西呢,是我们说的这个主实例,也就是我们是使用ant pre primary来。
02:01
标注的这个,那说明呢,它我们这个才生效,然后呢,还有conditional on property,当配置文件里面配置了某个属性的时候,我们才干某些事情等等等等,那么举举出这些例子,我们来做两个实例,我们给大家体验一下,我们就以这个conditional on being为例。好,我们来找一下,我们还是来到我们这段配置,这段配置呢,我们看到这有一个UZ01,我们给容器中注册了一个UZ01组件,那这个组件有没有它不一定,假设呢,我们给容器中都没有,都没有注册这个Tom组件,好我把这个注掉了啊注掉了以后呢,那为了啊引起啊,为了不让我们前边的这些东西啊引起一些错误,把这些全部注掉,因为我们把to组件都已经取消掉了,你再来获取to组件肯定有问题,所以呢,我们现在从run里边点,我们来啊,我们来获取调用一下这个方法叫contains b,我们判断一下容器里边是不是包含我们某一个组件,好因为我们把这个an b注解都去掉了,所以这个方法呢,其实就是一个常规方法,它并不能给容器中注册组件,来看一下容器中是不是有Tom这个组件。
03:12
我们在这儿呢,先来测试一下,好,我们来this out来打印容器中,容器中Tom组件,Tom组件有没有呢?我们来打印一下它的这个判断结果,那现在呢,我们容器中确实没有这个Tom组件,来给大家看一下。哎,没有我们这个宠物组先啊,我们来给大家确认一下。好,我们容器中呢,没有这个汤姆组件,但是呢,我们这个容器中有没有UZ01呢?那肯定还是有的,因为它给容器中要注册UZ01,我们再来确定一下,我们看一下。点一个get b,我们就来获取USER01,它呢是一个user类型的组件,行了,我们就直接调用它的这个content be,我们来进行一个判断得了。
04:05
这个也非常方便,就叫USER01,那么这个组件呢,叫USER01,来返回一下容器里边有没有USER01这个组件。USER01组件。来打印一下USER01。那现在来看我们的这个效果。我Tom这个组件呢,Enter特be应给它注掉了,相当于不给容器中加了,但USER01呢,照样还在容器中来确认一下没问题,但是呢,我最终希望的效果就是我们这个用户,因为它依赖我们这个宠物,如果容器中没有这个宠物,你也别给我容器中注册这个用户了,所以呢,我就可以使用一个条件注解,叫at conditional on being on be的意思就是在容器中有某个组件,有某个组件呢,我可以在这指定,好,我们来点进来这个BN里边呢,我们可以使用呃,Class指定我们这个组件的这个类型,当容器里边有这个类型的组件的时候,还有我们这个件的名字,好,来指定一个组件的名字吧,使用这个name来指定当我们这个容器中有这个名字的组件,哪个名字呢,就是有Tom这个组件的时候,我呢,在。
05:15
给容器中注入UZ01,因为以前呢,我们啊,不管三七二十一,全部把这个UZ01注册进来了,那现在来看,加上我的条件装配注解以后,现在就变成这样子。哎,我们现在看到我们容器中呢,USER01这个组件也都没了,所以呢,这是我们说的an,呃,咱们这个condition的啊逼应甚至于呢,我可以把这个东西我来标注在这个类上,标注在这个类上呢,也就是说当容器中有to组件的时候,下面这一堆才生效,否则的话呢,下面这一堆都不生效,比如我们给容器中我们不注册Tom了,我们注册一个TOM2。我们来看一下,我们来运行起来,我们看容器中会不会有我们这个USERA01。
06:06
因为我们容器中都没有Tom组件,所以USERZ01和TOM22这两个不可能存在容器中,虽然我们没判断M22 usera01既然不存在,你就算来判断TOM22肯定是也是没有的,我们不妨来获取一下。好,我们现在来获取一个这个TOM22。TOM22们来看一下这个TOM22组件,它呢确定是在容器中没有的,所以呢,我们这些条件注解如果加在方法上,就是当我们这个条件成立以后,我们这个方法返回的组件才会被注册在容器中,否则呢就不注册,如果加在类上,就是当我们这个条件成立以后,这个类下边的所有的这些配置才能生效,否则呢就不生效。这是我们说的条件装配,大家未来呢,在smart boot底层里边会遇见非常多的这些条件装配,当然大家呢,也可以自己先来尝试一下其他条件装配该怎么使用,我呢是以conditional on being为例,那相反的conditional啊,Miss being,就说容器中没有这个东西的时候才怎么做,比如我这个容器中没有Tom的时候,我呢就把USER1和TOM22我全加进去,我把这个条件呢,变成反向操作,原来呢,容器中有Tom我才加,所以呢,这些导致都没有,因为我们。
07:28
有,容器中没有,现在我变成容器中没有to姆,我再加name Tom,好来做一个测试,这就是条件装配的魅力。在spring boot底层呢,经常有这些判断,比如我们导入了某些场景,哎,当我们这个场景里边什么东西配了以后,我才帮你配什么,什么东西没配了,我就不帮你配了,或者你缺少什么了,我帮你配什么,会有非常非常多这样类似的条件装配,哎,我们现在就看到当容器中没有Tom的时候,哎,我们UZ01 tom22就有了。
08:02
好,这就是我们说的条件装配,我们随着后来不断学习过程中,我们就会理解条件装配在spring boot底层的重要性了。
我来说两句