第二章:重新认识IoC

IoC发展简介:你可能对IoC有些误会?

什么是IOC

在这里插入图片描述
在这里插入图片描述
IOC其实是一种编程思想或原则。相对于传统的编程方式(如从前文到后文这样串行顺序的方式),比如用传统方式,当我依赖一个对象,我要去创建它,对它进行属性配置,然后我才能使用这个对象。
但是对于IOC这种方式来说,它使对象或者组件的创建更为透明,不需要过多的关注细节(如创建对象、给对象设置属性,这些ioc容器都给我们设置好了),以达到解耦的目的。控制反转,简单来理解其实就是把获取依赖对象的方式,交给IOC容器来实现,由主动拉取,变为被动获取。

IoC主要实现策略:面试官总问IoC和DI的区别,他真的理解吗?

IoC 主要实现策略

在这里插入图片描述
在这里插入图片描述
以上就是讨论关于主流IOC的一个实现策略,可划分为2个部分:

  1. Dependency Lookup(依赖查找)
  2. Dependency Injection(依赖注入)
    在SpringFrameWork里面这2部分都有涉猎,这两部分都很重要

IoC容器的职责:IoC除了依赖注入,还涵盖哪些职责呢?

在这里插入图片描述在这里插入图片描述
依赖查找和依赖注入是对依赖处理的2种实现方式.依赖查找是主动的实现方式,依赖注入是被动的实现方式(尽管也有主动的方式),但是大多数工作时被容器给做掉了.无论是那种方式,最重要的还是最依赖的处理,依赖怎么来的以及怎么把它返回给客户端.这其中有不少环节.例如根据名或者类型来查找.其中也会涉及到类型转换.
生命周期

  1. 容器的生命周期.容器自己有自己的启动停止,暂停,终止回滚等操作.
  2. 托管资源并非是SpringBean.
    配置
    容器的配置(例如定时任务的容器)
    外部化配置:属性配置:xml,properties,yaml
    外部化配置和上面的生命周期中含义一直.

除了Spring,还有其它的IOC容器实现吗?

在这里插入图片描述
IOC是一种原则(好莱坞原则),IOC容器是将理论落地后的实现方式,具体可以实现哪些就参考职责.Ioc容器的实现并非只有Spring一家,在JavaSE,JavaEE,开源领域都有对IOC原则的容器的响应实现.

传统IoC容器实现:JavaBeans也是IoC容器吗?

在这里插入图片描述

/**
 * @author 秦啸
 * @Description Setter/Getter 方法
 * 可写方法(Writable)/可读方法(Readable)
 * @Date 创建于 2020/4/22 8:43
 */
public class Person {
    String name;

    Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}


/**
 * @author 秦啸
 * @Description
 * @Date 创建于 2020/4/22 8:47
 */
public class BeanInfoDemo {
    public static void main(String[] args) throws IntrospectionException {
        BeanInfo beanInfo = Introspector.getBeanInfo(Person.class,Object.class);
        Stream.of(beanInfo.getPropertyDescriptors())
                .forEach(propertyDescriptor -> {
                    System.out.println(propertyDescriptor);
                    // propertyDescriptor 允许添加属性编辑器 - PropertyEditor
                    // GUI -> text(String) -> PropertyType
                    // name-> String
                    // age -> Integer
                    Class<?> propertyType = propertyDescriptor.getPropertyType();
                    String propertyName = propertyType.getName();
                    if ("age".equals(propertyName)){// 为"age"字段/属性增加 O
                        //String -> Integer
                        propertyDescriptor.setPropertyEditorClass(StringToIntegerPropertyEditor.class);
                    }
                });
    }

    static class StringToIntegerPropertyEditor extends PropertyEditorSupport {
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            Integer value = Integer.valueOf(text);
            setValue(value);
        }
    }
}

轻量级IoC容器:如何界定IoC容器的“轻重”?

在这里插入图片描述
在这里插入图片描述
释放掉一些容器,容器更轻
最大化的代码复用
更大的程度上的面向对象
更大化的产品化
更好的测试

依赖查找 VS. 依赖注入:为什么Spring总会强调后者,而选择性忽视前者?

在这里插入图片描述

面试题

什么是 IoC ?
简单地说,IoC 是反转控制,类似于好莱坞原则,主要有依赖查找和依赖注入实现
按照IOC的定义,很多方面都是IOC.常说的 JavaBeans是IoC的一个容器实现,Servllet也是IoC容器的实现,因为Servlet可以去依赖或者反向的通过JDNI的方式进行得到一些外部的资源,包括DataSource或者相关的EJB的组件.
与此同时,像是Spring Framework依赖注入框架也能够帮助我们实现IoC,

依赖查找和依赖注入的区别?
依赖查找是主动或手动的依赖查找方式,通常需要依赖容器或标准 API
实现。而依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和
API

Spring 作为 IoC 容器有什么优势?
典型的 IoC 管理,依赖查找和依赖注入
AOP 抽象
事务抽象
事件机制
SPI 扩展
强大的第三方整合
易测试性
更好的面向对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值