美文网首页
Spring IOC详解

Spring IOC详解

作者: Aaron_Swartz | 来源:发表于2019-10-03 16:47 被阅读0次

前言:之前面试的时候,总是被q到这个问题,于是小结如下。
并且面试官提示从以下方面来回答这个问题:从ioc是什么,有什么优点,如何使用,原理是什么等四个方面一次介绍。

IOC(控制反转)

1 IOC的目的:为了解决对象之间的耦合度过高的问题。
2 IOC是什么:
软件系统在没有引入IOC容器之前,如果对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。
软件系统在引入IOC容器之后,这种情形就完全改变了,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。
通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。
3 IOC的别名:依赖注入(DI)
通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦.
4 IOC带来的好处

  • 就是可维护性比较好,非常便于进行单元测试,便于调试程序和诊断故障。代码中的每一个Class都可以单独测试,彼此之间互不影响,只要保证自身的功能无误即可,这就是组件之间低耦合或者无耦合带来的好处。
  • 置顶完接口以后,每个开发团队的成员都只需要关心实现自身的业务逻辑。而无需关注其他团队的工作进展。
  • 提高了模块的可复用性。
  • 模块具有热插拔特性。IOC生成对象的方式转为外置方式,也就是把对象生成放在配置文件里进行定义,当需要更换实现子类时,只要修改配置文件就可以了,完全具有热插拨的特性。

IOC实现原理剖析

IOC中最基本的技术就是反射(Reflection)编程

// spring中是通过设置私有成员变量可访问,然后通过反射将私有变量注入的。
Field[] fields = Teacher.class.getDeclaredFields(); 
        Student student = new Student();
        student.setName("zhangsan");
        Teacher teacher = new Teacher();
        for (Field field : fields) {
            if(field.getType().getName().equals(Student.class.getName())){
                //关键点!设置私有成员属性为可访问!
                field.setAccessible(true);
                //将已创建的对象赋值
                field.set(teacher, student);
            }
        }
        teacher.print();

IOC的注入方式

1 构造方法注入(基于xml)
2 setter属性注入(基于xml)
3 基于注解的注入(@Autowire等)

参考:
1 spring通过注解方式依赖注入原理 (私有成员属性如何注入)
2 Spring常用的三种注入方式

相关文章

网友评论

      本文标题:Spring IOC详解

      本文链接:https://www.haomeiwen.com/subject/beilyctx.html