关键字:
依赖控制反转,SpringIOC容器
什么是依赖控制反转?
许多非凡的应用都是由两个或多个类通过彼此合作实现业务逻辑,这使得每个对象都需要有其合作对象的引用。如果这个获取过程要靠自身实现,这将导致代码高度耦合,难易测试。
在面向对象系统中使用依赖反转的思想,使对象封装了数据和对数据的处理,对象的依赖关系常体现在对数据和方法的依赖上。这些依赖关系可以通过把对象的依赖注入交给框架或IOC容器来完成,从具体对象手中交出控制权。这种将从具体对象中获取依赖关系反转为从框架或IOC容器中获取依赖关系的方式成为依赖控制反转。核心在于:依赖对象的获得被反转了。
依赖控制反转有多种实现方式
在Spring中,IOC容器是实现依赖控制反转的载体,它可以在对象生成或者初始化时,直接将数据注入到对象中;也可以通过将对象引用注入到对象数据域中的方式来注入对方法的依赖。这种依赖注入是可以递归的,对象被逐层注入。将依赖控制反转,把控制权从具体业务对象手中转交到平台或框架中,促进了IOC设计模式的发展,是IOC容器要解决的核心问题。
哪些内容可以放到IOC容器中?
和系统运行状态弱关联的对象依赖关系的建立和维护
很多对象依赖关系的建立和维护并不需要和系统运行状态有很强的关联性,所以可以把面向对象编程中需要执行的诸如新建对象,为对象引用赋值等操作交由容器统一完成。这样散落在不同代码中功能相同的部分就集中成为容器的一部分,也就是成为面向对象基础设施的一部分。
对象类型的管理
面向对象系统中的对象,一部分是数据对象,还有很大一部分是用来处理数据的。这些对象并不常发生变化,是系统中基础的一部分。这种处理数据的对象很多时候不涉及数据和状态共享,可以设置为单例存在于系统中。需要共享时,可以再做处理。
不随着系统运行状态变化,稳定性强的依赖关系
依赖关系不会随着系统运行状态改变而改变
SpringIOC容器
SpringIOC提供了一个基本的JavaBean容器,通过IOC模式管理依赖关系,并通过依赖注入和AOP切面增强了为JavaBean这样的POJO对象赋予事务管理,生命周期管理等功能。
Spring使用IOC容器把获取资源的方式反转,通过让IOC容器管理依赖关系,将依赖关系注入到组件中,使依赖关系的适配和管理更加灵活。具体的注入实现方式有:接口注入(通过接口传参将引用注入),setter注入,构造器注入等,setter注入,构造器注入是主要的注入方式,setter注入更常用一些。而且为了防止注入异常,SpringIOC容器还提供了对特定依赖的检查。
在管理依赖关系时,可以通过可读的文本来配置,并且还能通过可视化工具对这些配置信息浏览和管理,从而提供对组件的管理水平。并且如果耦合关系需要变动,并不需要重新修改和编译源代码,这符合面向对象设计中的开闭原则。
同时,SpringIOC容器作为产品实现,设计了系列IOC容器,实现了对多种应用场景的适配。我们可以看到各种带有不同容器特征的实现:能够读取不同配置信息的容器设计;从不同I/O源读取配置信息的各种容器;更加面向框架的应用上下文的容器设计等。SpringIOC容器可以满足广大用户对IOC容器的各种使用需求。这时的SpringIOC容器,已经不是简单的Interface21框架,已经成为IOC容器的工业级实现。
总结:本文主要对Spring中的关键概念进行了解释。想了解具体实现的同学,可先阅读《Spring实战》或https://www.w3cschool.cn/wkspring/
参考:《Spring技术内幕》