依赖项
一个典型的企业应用程序并不由单一对象(或 Spring 术语中的 bean)组成。即使是最简单的应用程序,也有几个对象协同工作,向最终用户呈现一个连贯的应用程序。接下来的部分将解释如何从定义一系列独立的 bean 定义,到一个完全实现的应用程序,其中对象协作以实现目标。
章节摘要
📄️ 依赖注入
依赖注入(Dependency Injection,DI)是一种过程,通过这个过程,对象仅通过构造函数参数、工厂方法参数或在对象实例构造或从工厂方法返回后设置的属性来定义它们的依赖关系(即它们所依赖的其他对象)。容器在创建 bean 时注入这些依赖项。这个过程从根本上说是 bean 本身通过直接构造类或使用服务定位器模式来控制其依赖项的实例化或位置的逆过程(因此得名,控制反转)。
📄️ 依赖项与配置详解
如前所述,您可以将 bean 属性和构造函数参数定义为对其他托管 bean(协作者)的引用或定义为内联值。为此,Spring 基于 XML 的配置元数据在其 \<property/> 和 \<constructor-arg/> 元素中支持子元素类型。
📄️ 使用 depends-on
如果一个 bean 是另一个 bean 的依赖项,这通常意味着一个 bean 被设置为另一个 bean 的属性。通常,你可以通过 XML 元数据中的 \<ref/> 元素或通过自动装配来实现这一点。
📄️ 延迟初始化的 Beans
默认情况下,ApplicationContext 实现会在初始化过程中急切地创建和配置所有单例 bean。通常,这种预实例化是可取的,因为配置或周围环境中的错误会立即被发现,而不是在几个小时甚至几天后才发现。当这种行为不可取时,可以通过将 bean 定义标记为延迟初始化来防止单例 bean 的预实例化。延迟初始化的 bean 告诉 IoC 容器在第一次请求时创建 bean 实例,而不是在启动时创建。
📄️ 自动装配协作者
Spring 容器可以自动装配协作 bean 之间的关系。通过检查 ApplicationContext 的内容,你可以让 Spring 自动为你的 bean 解析协作者(其他 bean)。自动装配具有以下优点:
📄️ 方法注入
在大多数应用场景中,容器中的大多数 bean 都是单例的。当一个单例 bean 需要与另一个单例 bean 协作,或者一个非单例 bean 需要与另一个非单例 bean 协作时,通常通过将一个 bean 定义为另一个 bean 的属性来处理依赖关系。当 bean 的生命周期不同时,就会出现问题。假设单例 bean A 需要使用非单例(原型)bean B,可能是在 A 的每次方法调用时。容器只会创建单例 bean A 一次,因此只有一次机会设置属性。容器无法在每次需要时为 bean A 提供一个新的 bean B 实例。