Spring 框架简介
了解 Spring 作为依赖注入框架的概览。
Spring 框架是一个基于两个核心原则的开源 Java 应用框架:依赖注入 和 控制反转。Spring 具备在运行时自动装配依赖的能力,使开发者能够编写松散耦合的代码。
Spring 通过 XML 文件或 Java 注解等形式的元数据来创建对象并识别依赖关系,从而生成可直接使用的应用程序。
一个典型的 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 框架接管了依赖的注入过程,将 ContentBasedFilter 对象注入到 MovieRecommender 对象中。这与第一个代码示例中的方式形成对比——在那种情况下,MovieRecommender 自行创建了 ContentBasedFilter 实例。Spring 通过接管依赖的管理责任,实现了控制权的反转,这就是所谓的控制反转(IoC)。
总结来说,Spring 是一个依赖注入框架,它倡导编写松散耦合的代码。