依赖项
一个典型的企业应用程序并不是由单个对象(在Spring的术语中称为“bean”)组成的。即使是最简单的应用程序,也包含几个相互协作的对象,这些对象共同构成了最终用户所看到的完整应用程序。接下来的部分将解释如何从定义一些独立的bean定义,逐步发展到让对象之间协作以实现目标的完整应用程序。
部分总结
📄️ 依赖注入(Dependency Injection)
依赖注入(Dependency Injection,简称DI)是一种编程范式,在这种范式中,对象仅通过构造函数参数、工厂方法的参数,或在对象实例被创建后或从工厂方法返回后被设置的属性来定义它们的依赖项(即它们需要协同工作的其他对象)。然后,在创建该对象(bean)时,容器会负责注入这些依赖项。这一过程本质上是与传统的做法相反的(因此得名“控制反转”(Inversion of Control);在传统做法中,对象是通过直接构造类或使用服务定位器模式(Service Locator pattern)来自己控制其依赖项的实例化及定位的。
📄️ 依赖项与配置详解
如前一节所述,您可以将bean属性和构造函数参数定义为对其他受管理bean(协作者)的引用,或者定义为内联定义的值。Spring基于XML的配置元数据支持在其和元素中使用子元素类型来实现这一目的。
📄️ 使用 depends-on
如果一个bean是另一个bean的依赖项,那通常意味着一个bean被设置为另一个bean的属性。通常,你可以通过基于XML的元数据中的元素或通过自动 Wiring(自动装配)来实现这一点。
📄️ 惰性初始化Bean
默认情况下,ApplicationContext的实现会在初始化过程中积极地创建和配置所有的单例bean。通常,这种预先实例化的做法是可取的,因为这样可以在配置或周围环境出现错误时立即发现这些问题,而不会等到数小时甚至数天后才发现问题。当这种行为不合适时,你可以通过将bean定义标记为延迟初始化(lazy-initialized)来防止单例bean的预先实例化。延迟初始化的bean会告诉IoC容器在首次请求时才创建bean实例,而不是在启动时就创建。
📄️ 自动配置协作者
Spring容器可以自动配置协作bean之间的关系。你可以通过检查ApplicationContext的内容,让Spring自动为你的bean解析协作bean(其他bean)。自动配置具有以下优势:
📄️ 方法注入
在大多数应用场景中,容器中的大多数bean都是单例(singleton)。当一个单例bean需要与另一个单例bean协作,或者一个非单例bean需要与另一个非单例bean协作时,通常是通过将其中一个bean定义为另一个bean的属性来处理这种依赖关系的。然而,当这两个bean的生命周期不同时,就会出现问题。假设单例bean A需要在每次调用其方法时使用非单例(原型)bean B,那么容器只会创建一次单例bean A,因此也就只有一次机会来设置bean B的属性。容器无法在每次需要bean B时都为bean A提供一个新的bean B实例。