您的“关注”和“点赞”,是信任,是认可,是支持,是动力…
如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。
本文首发在IT羊资源网。
《IT羊资源网》,网址:https://www.ityangzy.com
IT羊资源网是IT世界的羊群!
一个致力于科技、信息技术和计算机领域的综合在线平台。
我们的使命是为读者提供最新、全面的科技资讯、技术教程和资源下载,帮助大家在不断变化的IT领域中保持领先。
欢迎每一位志同道合的人士加入羊群!
1 Spring Bean 概述
参考 Spring Framework Documentation 中 Bean Overview。
Spring 容器可以被看作为一个工厂,而 Spring 容器中的 Bean 就相当于该工厂的产品。如果需要这个工厂生产和管理 Bean,则需要告诉容器需要哪些 Bean,以及需要以怎样的方式将这些 Bean 装配到一起。
Spring IoC 容器可以管理一个或多个 bean
。这些 bean
是使用开发者提供给容器的配置元数据创建的,通常情况下,Spring 会以 XML <bean />
定义的文件格式作为 Spring 的配置文件,这种配置方式通过 XML 文件注册并管理 Bean 之间的依赖关系 。
XML 格式配置文件的根元素是 <beans>
,该元素包含了多个 <bean>
子元素,每一个<bean>
子元素定义了一个 Bean,并描述了该 Bean 如何被装配到 Spring 容器中。
在容器本身内,这些 bean
定义表示为 BeanDefinition 对象,其中包含以下元数据:
- 包限定的类名:通常,定义了 Bean 的实际实现类。
- Bean 行为配置元素:用于声明 Bean 在容器中的行为(作用域,生命周期回调等)。
- 依赖项:对其他 bean 进行工作所需的引用,这些引用也称为协作者或依赖项。
- 其他配置:要在新创建的对象中设置的其他配置设置,例如,池的大小限制或要在管理连接池的 bean 中使用的连接数。
定义 Bean 的示例代码,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
2 bean 元素的常用属性
部分常用属性介绍,可到 Spring Framework Documentation 中的 Bean Overview 中查看。
<bean>
元素中包含很多属性,常用属性如下所示:
id
: Bean 的唯一标识符,Spring 容器对 Bean 的配置和管理都通过该属性完成。class
:指定了 Bean 的具体实现类,它必须是一个完整的类名,使用类的全限定名(包名+类名)。name
:给 Bean 起的别名,name 属性中可以为 Bean 指定多个名称,每个名称之间用逗号或分号隔开。scope
:用于设定 Bean 实例的作用域,其属性值有 singleton、prototype、request、session 和 global Session。其默认值是 singleton。具体含义请看下面的第3小节 Spring Bean 的作用域。constructor-arg
:<bean>
元素的子元素,可以使用此元素传入构造参数进行实例化。该元素的 index 属性指定构造参数的序号(注意:从 0 开始),type 属性指定构造参数的类型。property
:<bean>
元素的子元素,用于调用 Bean 实例中的 Set 方法完成属性赋值,从而完成依赖注入。该元素的 name 属性指定 Bean 实例中的相应属性名。ref
:<property>
和<constructor-arg>
等元素的子元索,该元素中的 bean 属性用于指定对 Bean 工厂中某个 Bean 实例的引用。value
:<property>
和<constractor-arg>
等元素的子元素,用于直接指定一个常量值。
3 Spring Bean 的作用域
Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域。六种作用域,如下所示:
- (1)singleton
单例模式,也是 Bean 的默认模式,将每个 Spring IoC 容器的单个 bean 定义范围限定为单个对象实例。 - (2)prototype
原型模式,将单个 bean 定义的作用域限定为任意数量的对象实例。每次通过 Spring 容器获取 prototype 定义的 Bean 时,容器都将创建一个新的 Bean 实例。 - (3)request
将单个 bean 定义的范围限定为单个 HTTP 请求的生命周期。也就是说,每个HTTP请求都有一个在单个 bean 定义后面创建的 bean 实例。仅在可感知网络的 Spring 上下文中有效 ApplicationContext。而对不同的 HTTP 请求,会返回不同的实例,该作用域仅在当前 HTTP Request 内有效。 - (4)session
将单个 bean 定义的范围限定为 HTTP 的生命周期 Session。仅在可感知网络的 Spring 上下文中有效 ApplicationContext。在一次 HTTP Session 中,容器会返回该 Bean 的同一个实例。而对不同的 HTTP 请求,会返回不同的实例,该作用域仅在当前 HTTP Session 内有效。 - (5)application
将单个bean定义的作用域限定为的生命周期ServletContext。仅在可感知网络的Spring上下文中有效ApplicationContext。 - (6)websocket
将单个bean定义的作用域限定为的生命周期WebSocket。仅在可感知网络的Spring上下文中有效ApplicationContext。