Spring IOC
IOC 原理
代码耦合
实际开发中,我们如果在对象 A 内部去创建、修改或者注销另一个对象 B,这会导致对象之间非常复杂的依赖关系,不利于代码的维护更新。
比如我们直接在上层类内调用了底层类的构造方法,一旦底层类的构造方法发生改变,就必须修改所有上层类的代码。
依赖注入
( Dependency Injection ) 我们用依赖注入的方式来降低耦合度。所谓依赖注入,就是把底层对象作为参数传入上层对象。避免底层类被修改后上层类代码也要随之改动。我们一般通过构造方法或者 setter 方法注入底层对象。
设值注入:依赖的对象通过 setter 方法传入的,对象已经实例化,发生属性填充和依赖注入的时候。
构造注入:依赖的对象是通过构造器传入,发生在实例化 Bean 的时候。
主要采用设值注入,性能更好更易读。但对于依赖关系无需变化的 Bean 采用构造注入。所有的依赖关系全部在构造器内设定。
优势:使用依赖注入后,即使底层类发生变化,上层类代码也不必改动,大大降低了代码的耦合度。
劣势:但这也导致了我们在初始化对象的过程中要书写复杂的代码。
控制反转
( Inversion of Control ) 控制反转,将对象的管理权交给 IOC 容器。
Spring 框架内会定义一个 IOC 容器类,通过其来统一管理对象的生命周期:创建、资源存取、注销;并自动维护对象间的依赖关系。用户只需要配置 XML 文件或者添加注解标明类之间的映射关系,初始化过程中的代码将由 IOC 容器自动完成。
IOC 容器底层通过工厂模式和 Java 反射机制来实现:
IOC 容器根据 XML 配置文件或者注解读取 Bean 中保存的对象信息。
IOC 容器充当工厂类,利用 Java 反射机制读取需要生成哪些对象,来自动生成相应的对象。
版权声明: 本文为 InfoQ 作者【武师叔】的原创文章。
原文链接:【http://xie.infoq.cn/article/bb8d90d8681c738b93c5bca38】。文章转载请联系作者。
评论