Spring Framework 简介
Spring是一个开源、轻量级、依赖注入(DI)容器和框架,用于构建Java企业应用程序。
- Spring 官网:spring.io
- Spring 中文网:springdoc.cn
Spring是一个开源、轻量级、依赖注入(DI)容器和框架,用于构建Java企业应用程序。
一个Bean定义可以包含大量的配置信息,包括构造函数参数、属性值以及容器特定的信息,比如初始化方法、静态工厂方法名称等等。 一个子Bean定义会从父定义中继承配置数据。子定义可以根据需要覆盖一些值或添加其他值。 使用父子Bean定义可以节省大量的输入工作。实际上,这是一种模板化的形式。
如果你以编程方式使用ApplicationContext
接口,子Bean定义由ChildBeanDefinition
类表示。
大多数用户不会在这个层面上直接操作它们。相反,他们会在诸如ClassPathXmlApplicationContext
之类的类中以声明性方式配置Bean定义。
当你使用基于XML的配置元数据时,可以通过使用parent
属性指定父Bean来表示子Bean定义,将父Bean作为此属性的值。以下示例展示了如何这样做:
Spring框架提供了多种接口,你可以使用这些接口来定制Bean的性质。本节将它们分为以下几类:
当你创建一个Bean定义时,实际上是在创建Bean定义所定义类的实际实例的配方。 将Bean定义视为“配方”的概念非常重要,因为它意味着,就像一个类一样,你可以从一个单一的“配方”中创建多个对象实例。
你不仅可以控制Bean定义中的各种依赖项和配置值,还可以控制由Bean定义创建的对象的作用域(scope)。
这种方法是强大且灵活的,因为你可以通过配置选择创建的对象的作用域,而不必在Java类级别上固定对象的作用域。
Bean定义可以是多种作用域之一。Spring框架支持六种作用域,其中四种仅在使用Web感知(aware)的ApplicationContext
时才可用。
你还可以创建自定义作用域。
企业应用程序通常不是由单个对象(或Spring
术语中的Bean
)构成的。
即使是最简单的应用程序,也是由多个对象共同协作来呈现给最终用户一个连贯的应用体验。
下一节将解释如何从定义独立的Bean开始,逐步实现一个完整的应用程序。 在这个应用程序中,各个对象将相互协作,实现一个共同的目标。
Spring容器可以自动装配协作Bean之间的关系。
你可以通过检查ApplicationContext
的内容,让Spring自动为你的Bean解析协作对象(其他Bean)。
自动装配的优势
Spring IoC(控制反转)也被称为依赖注入(DI)
它是一个过程,对象仅通过构造参数、工厂方法参数或在对象实例被构造函数或工厂方法返回后,在其上设置的属性来定义它们的依赖关系。
在IoC容器创建Bean时,它会自动注入这些依赖项。 不再需要通直接构造依赖项
或使用服务定位器模式
等方式来管理对象的实例化或位置,
而是交由IoC容器来管理,因此称为控制反转。
DI解耦
如果一个Bean是另一个Bean的依赖项,这意味着一个Bean被设置为另一个Bean的属性。 可以通过<ref/>元素 来实现这一点。 然而,有时Bean之间的依赖关系并不那么直接。
举个例子:当一个类中的静态初始化器需要被触发时,比如数据库驱动程序的注册。
depends-on
属性可以强制容器在初始化beanOne
Bean之前先初始化指定的manager
Bean。
以下示例使用depends-on
属性来表达对单个Bean的依赖:
在Spring框架中,ApplicationContext
的默认行为是在启动过程中立即创建并配置所有的单例Bean。
这种做法有利于及时发现配置错误或环境问题,避免了错误在应用运行一段时间后才暴露。
然而,如果需要改变这一行为,可以通过设置Bean定义为懒加载(lazy-initialized)来实现。
这样一来,Bean的实例化将被推迟到第一次实际请求该Bean时进行,而不是在应用启动时完成,从而提供了更大的灵活性和控制。
在XML中,通过<bean/>
元素上的lazy-init
属性来控制这种行为,如下例所示:
大多数应用场景中,容器中的大多数Bean都是单例(singleton) 的。 当一个单例(singleton)Bean需要与原型(prototype)Bean协作时,传统的注入方式可能不再适用。 这是因为单例Bean在整个应用生命周期内只创建一次,而原型Bean每次请求时都会创建一个新的实例。