Spring学习笔记——IOC、依赖注入DI和Spring作用浅析

本文探讨了依赖注入DI的概念,解释了为何使用DI以实现松耦合和提高代码可复用性。接着深入讨论了Spring框架如何通过IOC实现DI,包括Spring自动装配的原理,强调了Spring在简化对象创建和管理中的重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.依赖注入DI

1.1 什么是DI

简单来说,就是在如果在一个对象主体中要使用另一个对象,为了实现松耦合,通过传递被使用对象的引用到该对象主体,来实现对该对象的使用。
举个简单的例子:

代码1.1.1

class Engine{
	public void start(){}
}
class Car{
	public void run(Engine engine){engine.start()}
}

1.2 为什么要DI

很明显的一点是为了实现松耦合,提高可复用性
正如上面的例子。如果不通过DI,那么需要在Car对象中new一个Engine对象。

代码1.2.1

class Engine{
	public void start(){}
}
class Car{
	private Engine engine = new Engine();
	public void run(){engine.start()}
}

而上面这种方式,无疑使得Car对象,变得臃肿了,主要是使得Car和Engine紧耦合在了一起,如果以后,想对Engine进行扩展,势必Car也得被迫进行重构。
比如说,有了几种可供选的Engine装置,则需要重构Engine,而使Engine能够满足这种多态,则需要重构Engine为一个Interface,如下。
代码1.2.2

Interface Engine{
	public void start();
}
class Engine1 implements Engine{
	public void start(){};
} 
class Engine2 implements Engine{
	public void start(){};
} 

而如果还像代码1.2.1那种方式实现Car的话,无疑Engine的改动也会迫使Car进行改动。但是如果像代码1.1.1那种方式的话,则并不需要对Car进行改动。

2.Spring框架的DI

2.1 为什么需要Spring框架

上面已经说了DI的基本概念及其作用。下面我们想一下,如果想要完成一项大项目,势必会有很多对象,而且对象之间很可能会互相协作完成一些必要功能,但最初并不能够了解以后哪些类可能会被扩展,所以最好的方案是,尽可能所有对象要协作完成的功能都需要通过DI方式实现。
而DI方式则要求,需要在调用相关协作方法时传入,一个实例对象的引用。那么问题就来了,何时创建实例对象并注入到调用对象中去,如果不用框架的话,则需要我们程序员来判定,当需要的时候new 一个对象并注入,或许我们会再写一个函数,包含这一过程。这无疑极大的增加了我们的编程困难。
而Spring框架则是帮助我们解决这一难题的,它可以在需要时,自动帮我们创建对象并注入,并且还会帮我们自动销毁不再需要的对象。这正是IOC(控制反转,对象的管理都交由IOC容器来完成)的概念。

2.2 Spring自动装配的实现

对于Spring框架来说,实现自动装配首先要考虑的两点是:

  • 在编码Spring框架时并不能预见使用Spring框架的编程人员需要创建何种对象。
  • 需要让用户设计的系统不依赖于产品类实例如何被创建,组合、和表达的细节。

显然上述两点需要通过工厂模式动态代理模式来实现,通过工厂,可以代为生成对象实例,通过代理可以实现将引用注入到调用对象(实际上是代为执行)中去的功能,其具体实现细节后面专门分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值