如何理解控制反转(IOC)| 小册免费学

338 阅读4分钟

背景

又到了求职季,各应届生、准应届生争着投递大厂的岗位,java后端可谓是卷中卷,简历上到处写着“精通SpringFramework”,各种项目齐刷刷列举,无不彰显其深厚的功底。

然鹅,面试官定睛一看,好哇,竟然写了“精通”,我这没日没夜工作了三年的“老油条”都不敢加粗写上“精通”二字,那就让我来会会你!当即打电话,“喂,是卷王吗?我是xxx大厂的xxx核心部门的,我们约场面试吧,你什么时候有空?”

只听那边回复:“现在就可,你尽管放马过来吧!”

面试官一听,好家伙,让我来看看你是不是真的这么厉害!“据说你精通Spring Framework,那你先讲讲它的核心之一:IOC,你是如何理解的?”

IOC是什么?

卷王轻轻一笑,基础介绍信手拈来:“IOC,通常叫控制反转,是面向对象编程中的一种设计原则,在Spring中将获取对象的方式交给了BeanFactory,这种将控制权交给容器的思想即为控制反转,可以用来减低计算机代码之间的耦合度,并且通过容器管理,提高了系统的鲁棒性。

实现控制反转主要有两种方式:依赖注入和依赖查找。两者的区别在于,前者是被动的接收对象,在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的属性中,而后者是主动索取相应类型的对象,获得依赖对象的时间也可以在代码中自由控制。”

IOC的思想是如何实现?

面试官一听,不错,要点都达到了,不过既然是精通,还是需要进一步校验的!随即发问:“你刚刚说控制反转能够降低计算机代码之间的耦合性,并通过容器管理提高了系统的鲁棒性。依赖注入和依赖查找的过于笼统,你能具体点说说这些功能怎么实现的?”

卷王一听,暗自狂喜,这不是昨天刚模拟过的嘛,清了清喉咙,自信地说,让我来给你捋捋!

利用静态工厂将依赖抽取分离

Spring一大特征即分为了表现层、持久层、业务层,上层调用下层,既然存在调用关系,必然有耦合,而利用静态工厂,将层的具体实现封装起来,当需求变动的时候,能够将某一层的变动尽可能地蜷缩在该层上,而不用去修改其他层的代码。这样的好处是显而易见的,分工明确,权责分明。

外部化配置文件+反射可解决配置的硬编码问题

反射可以声明一个类的全限定名,来获取它的字节码描述,从而构造对象!通过这种方式,提高了系统的robust,在不涉及到问题模块的时候仍然能保证其他模块的正常运行。再配合上外部化配置文件,更好地使得业务代码抽象化,能够更好地应对需求变化,将需要修改的内容进一步地集中于外部化配置文件的修改。下述代码为模拟实现“外部化配置文件+反射”的例子:

    public static Object getBean(String beanName) {
        try {
            // 从properties文件中读取指定name对应类的全限定名,并反射实例化
            Class<?> beanClazz = Class.forName(properties.getProperty(beanName));
            return beanClazz.newInstance();
        } catch (ClassNotFoundException e) {
            throw new RuntimeException("BeanFactory have not [" + beanName + "] bean!", e);
        } catch (IllegalAccessException | InstantiationException e) {
            throw new RuntimeException("[" + beanName + "] instantiation error!", e);
        }
    }

PS:该例子来源于《从0开始深入学习Spring》。

利用缓存控制对象实例数

有的时候某些对象并不需要频繁创建,只需要一定实例数进行复用即可,就像线程池的原理一样,针对这点,可以利用缓存的思想,将创建的对象存储起来,当需要再次获取时直接返回即可,使得满足业务需求的情况下加快了系统的响应速度,可以用HashMap<对象名,对象值>进行存储,在实例化的过程中利用DCL(双重校验锁)来控制并发,当然,Spring采用的是LocalThread的方式规避并发问题,具体就不细说了哈,想知道的小伙伴可以自行了解下!

面试官一听,不错嘛,确实有点深入,称得上卷一词,现在的学生也太强了,让我们这些社会人咋办啊,不行我也得去学习了。“卷王同学,回答得不错,就先等着消息吧”。

(完)

本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情