IOC:Inversion of Control,即“控制反转”
DI:Dependency Injection,即“依赖注入”
参考文档:
原始吃鸡流程
假如自己是个吃鸡队员,要上线打仗,本来什么都没有,所以就自己去寻找武器,弹药,医疗箱,食物等,这些依赖品都需要我们自己来一一去寻找并和他们进行组合,也就是所谓的我们只有依赖于这些对象,控制这些对象,和他们进行组合之后才能达到我们吃鸡的目的,于是N多个吃鸡队员都要去寻找自己的依赖对象来达到不同的目的。
改良后的吃鸡流程
后面陆战队的领导成立了后勤部门,部门名字为IOC容器,后勤部门说了,我这边什么都有,你们不要自己去找资源了,想要啥问我要,于是吃鸡队员就按照自己不同的依赖需求直接伸手去拿,并且拿来即用,再也不用费劲儿去找了。
改良前后对比分析
改良之后,吃鸡队员动手拿资源的过程,并不是自己主动去拿,而是后勤部门(IOC容器)会在你执行作战任务的时候(程序运行时)动态的识别你需要什么并送到你手上(依赖注入-DI),关于依赖注入是有两种方式的,一种是你想要什么就问后勤部门要什么,另外一个就是被动的让后勤部门给你发放,也就是所谓的主动注入和被动注入。
那么,现在对象获取的控制权不在你的手上,而是在后勤部门手上(IOC容器),也就是所谓的控制反转(IOC),但是后勤部门本身也有发错装备的时候,那么吃鸡队员就会打call给后勤部门投诉(程序启动的时候报错)。
为什么要成立后勤部门
之前每个吃鸡队员要去寻找装备,费时费力,并且资源浪费。
费时费力: 每次都要去自己找资源,可能会引起资源冲突,比如张三和李四花了一个小时都去找资源发现了同一个沙漠之鹰,但是只能一个人拿去用。
资源浪费:张三手上有个AK47,但是一直不用,李四手上只有一个木棍,AK47找了一天都没找到,后来被KO了~😂。
成立后勤部门后统一调配资源,省时省力,实现了资源优化配置。
省时省力: 不用跑腿,不用去捡装备,在合适的时间后勤部会给你合适的装备。
关于“合适的时间”:默认情况下,在程序编译时,准确的说是在SpringBoot启动时,IOC容器会自动创建对象,并且注入到我们的代码片段里;但是我们可以更改默认机制,来延迟实例化:就是在使用方和被使用方都加上@Lazy注解。
资源优化配置:
张三手上有个AK47,但是一直不用这种情况不存在了,因为只有张三使用的时候才会发给他,不用的时候就进行回收(对象的创建,回收,分配,再利用)从而提高资源的复用率。 一个对象创建/回收的典型例子就是@Conditional条件注解,比如AK47他的损坏程度达到了60%, 那么可以通过条件注解来决定当损坏率达到60%的时候不让AK47进入后勤部门待发放仓库中(IOC容器);另外也可以通过优先级注解@Primary来决定,当有AK47,AK48等等的时候,如果AK47这个Bean被打上了@Primary注解,那么就会优先被放置到IOC容器。注意,这里的条件注解和优先级注解是针对放入容器的,而不是容器注入,所以注解是使用在AK47这个被放入容器的Bean的位置。那么对于李四来说,就不会拿到一个不能用的AK47了,而且可以根据优先级设定来拿到相对更好用的武器装备。
=>在这里我们的关注点是AK47这个类,当你想换个装备或者在某个前提条件下替换装备时(当某个类的需求发生变化的时候)我们可以分别通过@Primary和@Conditional来进行对应的处理。
当张三想替换所有的装备,枪,头盔,鞋子,医疗箱,坦克,大炮,飞机等等,也就是涉及到大量的装备的自动装配问题,我们需要灵活的替换所有这些装备,那就需要SPI的机制进行处理。SPI全称:Service Provider Interface,基于Interface + 策略模式+ 配置文件, Interface和策略模式解决了张三/李四的枪的问题,但是没有解决其他装备的问题,那么通过配置文件就可以灵活的进行装备的批量装配问题(将配置批量导入到IOC容器以及注入的问题),关于这个问题请参考:自动装配
最后祝大家吃鸡愉快~