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

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框架则是帮助我们解决这一难题的,它可以在需要时,自动帮我们创建对象并注入,并且还会帮我们自动销毁不再需要的对象。

2.2 Spring自动装配的实现

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

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

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

你可能感兴趣的:(Java基础详解,Spring学习)