Logo
Section 1 / 5

Spring 框架简介

了解 Spring 作为依赖注入框架的概览。

导入

Spring 框架简介

了解 Spring 作为依赖注入框架的概览。

Spring 框架是一个基于两个核心原则的开源 Java 应用框架:依赖注入 和 控制反转。Spring 具备在运行时自动装配依赖的能力,使开发者能够编写松散耦合的代码。

Spring 通过 XML 文件或 Java 注解等形式的元数据来创建对象并识别依赖关系,从而生成可直接使用的应用程序。

...
Spring 创建一个可直接使用的应用程序

一个典型的 Web 应用通常分为三层:表现层、业务层和数据层。这些层次中的对象相互协作以实现应用功能。这种协作关系被称为 依赖。一个典型的应用包含大量类和依赖关系。

紧耦合

紧耦合的代码表现为在类内部直接创建依赖实例。例如,假设我们有一个推荐电影观看的应用程序,该程序使用基于内容的过滤方法,结合项目之间的相似性以及用户偏好。MovieRecommender 类直接实例化了 ContentBasedFilter 对象,因此 ContentBasedFilter 成为 MovieRecommender 的依赖。

1// MovieRecommender 类 2public class MovieRecommender { 3 ContentBasedFilter filter = new ContentBasedFilter(); 4 //... 5}
1// ContentBasedFilter 类 2public class ContentBasedFilter { 3 //... 4}

当需要更换依赖实现时,问题就会出现。比如,如果基于内容的过滤器未能提供理想的推荐结果,我们希望改用协同过滤(考虑与当前用户观看过相似电影的其他用户的选择)。这将要求修改 MovieRecommender 类的代码,这是紧耦合代码的一个明显缺点。

松耦合

更好的做法是引入接口。这样可以避免直接实例化 ContentBasedFilter,而是通过构造函数接收所需类型的过滤器作为参数。

1interface Filter { 2 // 方法声明 3}

以下是接口的实现方式:

1public class ContentBasedFilter implements Filter { 2 // 实现接口中的方法 3}

下面是 MovieRecommender 类的定义:

1public class MovieRecommender { 2 Filter filter; 3 4 public MovieRecommender(Filter filter) { 5 this.filter = filter; 6 } 7 //... 8}

这样一来,MovieRecommender 不再依赖于特定类型的过滤器,既可以配合基于内容的过滤器使用,也可以配合协同过滤器使用。上述代码示例体现了松散耦合的设计思想。松耦合具有诸多优势。

1public static void main(String[] args) { 2 MovieRecommender recommender = new MovieRecommender(new ContentBasedFilter()); 3 //... 4}

在此处,我们创建了一个实现了 Filter 接口的 ContentBasedFilter 对象,以及一个 MovieRecommender 对象,并将 ContentBasedFilter 对象注入到 MovieRecommender 对象中。Spring 框架会自动完成上述代码所做的事情。Spring 负责创建对象并填充依赖关系。作为开发者,你只需说明需要创建哪些对象,以及每个对象的依赖关系是什么。

...
Spring 框架

Spring 框架接管了依赖的注入过程,将 ContentBasedFilter 对象注入到 MovieRecommender 对象中。这与第一个代码示例中的方式形成对比——在那种情况下,MovieRecommender 自行创建了 ContentBasedFilter 实例。Spring 通过接管依赖的管理责任,实现了控制权的反转,这就是所谓的控制反转(IoC)。

总结来说,Spring 是一个依赖注入框架,它倡导编写松散耦合的代码。

历史