Spring IOC
IOC
,全称
(Inverse Of Control)
,中文意思为:控制反转,
Spring
框架的核心基于控制反转原理。
什么是控制反转?
控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术。
<!>由容器控制程序之间的关系,而不是由代码直接控制
<!>由于控制权由代码转向了容器,所以称为反转
对象与对象之间的关系可以简单的理解为对象之间的依赖关系:
依赖关系:在
A
类需要类
B
的一个实例来进行某些操作,比如在类
A
的方法中需要调用类
B
的方法来完成功能,叫做
A
类依赖于
B
类。
一个需要特定的依赖的组件一般会涉及一个依赖对象,在
IOC
的概念中叫做目标
(target)
。换句话说,
IOC
提供了这样的服务,使一个组件能够在它的整个生命周期中访问它的依赖和服务,用这种方法与它的依赖进行交互。总的来说,
IOC
能够被分解为两种子类型:依赖注入和依赖查找。
(1)
依赖查找
比如使用
JNDI
注册一个数据库连接池的示例中,代码中从注册处获得依赖关系的
JNDI
查找
(JNDI lookups)
:
initContext = new InitialContext();
//
获取数据源
DataSource ds = (DataSource)
initContext.lookup("java:comp/env/jdbc/mysql");
|
(2)
依赖注入
(Dependency Injection)
依赖注入:两个对象之间的依赖关系在程序运行时由外部容器动态的注入依赖行为方式称为依赖注入
(DI)
。
DI
是
IOC
的一种形式。
IoC
在应用开发中是一个非常有力的概念。如
Martin Flower
所述,
IoC
的一种表现形式就是依赖性注射。依赖性注射用的是好莱坞原则,
"
不要找我,我会找你的。
"
。换句来说,你的类不会去查找或是实例化它们所依赖的类。控制恰好是反过来的,某种容器会设置这种依赖关系。使用
IoC
常常使代码更加简洁,并且为相互依赖的类提供一种很好的方法。
依赖注入的三种实现类型:接口注入、
Setter
注入和构造器注入。
<1>
接口注入
(Type1)
public class ClassA {
private InterfaceB clzB;
public void doSomething() {
Ojbect obj =Class.forName(Config.BImplementation).newInstance();
clzB = (InterfaceB)obj;
clzB.doIt()
}
……
}
|
上面的代码中,
ClassA
依赖于
InterfaceB
的实现,如何获得
InterfaceB
实现类的实例?传统的方法是在代码中创建
InterfaceB
实现类的实例,并将起赋予
clzB
。
而这样一来,
ClassA
在编译期即依赖于
InterfaceB
的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名
(Config.BImplementation)
,动态加载实现类,并通过
InterfaceB
强制转型后为
ClassA
所用。这就是接口注入的一个最原始的雏形。
而对于一个
Type1
型
IOC
容器而言,加载接口实现并创建其实例的工作由容器完成,见如下代码。
public class ClassA {
private
InterfaceB clzB;
public
Object doSomething(InterfaceB b) {
clzB
= b;
return
clzB.doIt();
}
……
}
|
在运行期,
InterfaceB
实例将由容器提供。
Type1
型
IOC
发展较早(有意或无意),在实际中得到了普遍应用,即使在
IOC
的概念尚未确立时,这样的方法也已经频繁出现在我们的代码中。
下面的代码大家应该非常熟悉:
public class MyServlet extends
HttpServlet {
public
void doGet(HttpServletRequest request,HttpServletResponse response)throws
ServletException, IOException {
……
}
}
|
这也是一个
Type1
型注入,
HttpServletRequest
和
HttpServletResponse
实例由
Servlet Container
在运行期动态注入。
<2>Setter(
设值
)
注入
(Type2)
各种类型的依赖注入模式中,设值注入模式在实际开发中得到了最广泛的应用。
public class ClassA {
private InterfaceB clzB;
public void setClzB(InterfaceB clzB) {
this. clzB = clzB;
}
……
}
|
详见
Hello World
程序
<3>
构造器注入
(Type3)
依赖关系是通过类构造函数建立的
容器通过调用类的构造方法将其所需的依赖关系注入其中
public class DIByConstructor {
private
final DataSource dataSource;
public
DIByConstructor(DataSource ds) {
this.dataSource
= ds;
}
……
}
|
<4>
三种依赖注入方式的比较
接口注入:
接口注入模式因为历史较为悠久,在很多容器中都已经得到应用。但由于其在灵活性、易用性上不如其他两种注入模式,因而在
IOC
的专题世界内并不被看好。
Setter
注入:
<!-- [if !supportLists]-->l
<!-- [endif]-->对于习惯了传统
javabean
开发的程序员,通过
setter
方法设定依赖关系更加直观。
<!-- [if !supportLists]-->l
<!-- [endif]-->如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。
<!-- [if !supportLists]-->l
<!-- [endif]-->如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。
构造器注入:
<!-- [if !supportLists]-->l
<!-- [endif]-->在构造期间完成一个完整的、合法的对象。
<!-- [if !supportLists]-->l
<!-- [endif]-->所有依赖关系在构造函数中集中呈现。
<!-- [if !supportLists]-->l
<!-- [endif]-->依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。
<!-- [if !supportLists]-->l
<!-- [endif]-->只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。
总结:
可见,
Type3
和
Type2
模式各有千秋,而
Spring
、
PicoContainer
都对
Type3
和
Type2
类型的依赖注入机制提供了良好支持。这也就为我们提供了更多的选择余地。理论上,以
Type3
类型为主,辅之以
Type2
类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于
Spring Framework
开发的应用而言,
Type2
使用更加广泛。
分享到:
相关推荐
Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中...
SpringIOC是Spring Framework中的核心组件之一,负责管理应用程序中的对象、依赖关系和生命周期。 在 Spring IOC 中,对象的创建和管理是通过 BeanFactory 或 ApplicationContext 实现的。BeanFactory 是 Spring ...
springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...
spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...
Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...
Spring IoC 加载流程讲解 在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和依赖倒置原则的应用。 IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从...
Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和管理通常由开发者自己控制。而在Spring IOC中,这种控制权被反转,对象的创建、初始化、...
IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 优点 1. 简化对象的创建:IoC ...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...
spring Ioc容器配置 IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root ...
Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件之间的依赖管理。在本文中,我们将深入探讨 Spring IOC 的概念、工作原理以及如何在实际项目中应用。 首先,理解 IOC ...
Spring IOC和DI的区别在于,IOC是一种设计思想,强调的是控制权的转移,而DI是实现这一思想的具体方式,即通过外部容器来管理对象的依赖关系。理解这两者的关系有助于我们更好地设计和实现面向对象的应用。 在实际...
3. **依赖注入**:这是Spring IOC的另一个关键概念。Spring通过构造函数注入、setter注入或属性注入来实现对象之间的依赖关系。这种方式使得代码更加灵活,易于测试和维护。 4. **Spring容器**:Spring提供了两种...
Spring IoC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它是一种设计模式,改变了传统程序中的对象创建和管理的方式,将对象的生命周期管理交由Spring容器来负责,使得代码更加解耦,...
Spring IOC,即Spring控制反转,是Spring框架的核心特性之一。控制反转(Inversion of Control,简称IoC)是一种设计原则,用于减少代码间的耦合,提高系统模块化和代码的重用性。在Spring框架中,IOC具体体现在对...
Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...
Spring框架的依赖注入(Dependency Injection, DI)是其核心特性之一,而Spring的IOC(Inversion of Control,控制反转)是DI的一种实现方式。在传统的编程模式中,对象通常负责自己创建所需的依赖项。而在Spring中...
标题《Spring IoC源码深度剖析开源架构源码2021.pdf》和描述《Spring IoC源码深度剖析开源架构源码2021.pdf》表明该文档主要面向于分析Spring框架中控制反转(IoC)容器的核心源码,解析和理解其内部的工作机制及...
IoC(Inversion of Control)即控制反转,是 Spring 的核心特性之一。在传统的编程模式中,对象之间存在依赖关系,程序员需要手动创建和管理这些对象。而在 Spring 中,IoC 容器负责管理和创建对象,对象之间的依赖...
其中,IoC和依赖注入(Dependency Injection, DI)是Spring框架最核心的部分之一。 #### 二、IoC容器概述 在传统的Java应用程序中,对象的创建和管理通常由程序员来完成。这种方式会导致代码之间存在高度耦合,难以...