当前位置: 首页 > 图灵资讯 > 技术篇> 【Spring Boot 初识丨 beans 】

【Spring Boot 初识丨 beans 】

来源:图灵教育
时间:2023-07-27 10:50:17

上一篇讲了 Spring Boot 本文将讨论主程序类 beansSpring Boot 初识:

(beans)

一、 定义

  Spring beans是Spring框架的核心概念之一,它们是Spring 物联网容器中的实例对象。在Spring应用程序中,所有组件都由Spring容器管理,Spring容器是通过创建和管理bean来实现的。  Spring bean可以是普通的Java类,也可以是接口或抽象类的实现类。当一个Java类被标记为@Component、@Service、@当Repository等注释时,它将成为Spring bean,并由Spring容器管理。  Spring容器将自动创建和管理bean的生命周期,包括实例化、属性注入、依赖注入、初始化和销毁。开发人员可以通过配置文件或注释来定义bean的属性和依赖性,从而实现代码的重用和解耦。

  bean元素包含:

  • 包限定的类名:通常定义 bean 实际实现类。
  • Bean 行为配置元素,说明 bean 行为方式(作用域、生命周期回调等。)在容器中。
  • Bean 其他bean引用执行其工作所需。这些引用也被称为 collaborators或 dependencies。
  • 设置在新创建对象中的其他配置设置,如管理连接池 bean 使用的连接数,或池的大小限制。
二、 命名

  每个 bean 都有一个或多个标志符。这些标志符正在携带中 bean 它必须是唯一的容器。一个 bean 通常只有一个标识符,但如果需要多个标识符,多个标识符可以视为别名。  在基于 XML 在配置元数据中,您使用它 id 和/或 name属性来指定 bean 标识符。该id允许您准确指定属性 ID。这些名字通常是字母数字(通常是字母数字)myBean'、'fooService' 等等),但也可以是特殊字符。如果要将其他别名引入bean,也可以在属性中指定name,使用逗号(,)、分号(;)或空格分隔。作为历史记录,在 Spring 3.1 在之前的版本中, 输入id属性 xsd:ID,它限制了可能的字符。从 3.1 起初,现在是xsd:string. 请注意,bean id 容器的独特性仍然是强制执行的,但不再是强制执行的 XML 强制执行分析器。  您不需要为 bean 提供名称或 ID。如果没有显式提供名称或名称,如果没有显式提供 ID,容器会为该 bean 生成一个唯一的名字。但是,如果你想使用它,如果你想使用它ref或者Servicece元素或者Service Locator 通过名字搜索引用这个 bean,必须提供一个名字。bean的命名协议:  协议是命名的 bean 时使用标准 Java 约定为实例字段的名称。也就是说,bean 名字从小写字母开始,从那时起使用驼峰大小写。这类名称的示例为“accountManager', 'accountService', 'userDao', 'loginController' (无引号) 等

  一直如一命名 bean 使您的配置更容易阅读和理解,如果您使用它 Spring AOP,将通知应用于一组名称相关的通知 bean 会有很大的帮助。在 bean 定义之外为 bean 添加别名:  在基于 XML 您可以在配置元数据中使用 <alias/>完成此操作的元素

三、 生命周期

  Spring Bean的生命周期包括以下四个阶段:

  • 实例化阶段(Instantiation):创建并分配内存空间的Bean。
  • 属性赋值阶段(Populate):设置了Bean的属性,可以使用setter方法或构造函数注入。
  • 初始化阶段(Initialization):Bean的初始化过程可以在这里进行一些自定义的操作。
  • 销毁阶段(Destruction):Bean被销毁并释放内存空间。
3.1 实例化

  bean 定义本质上是创建一个或多个对象的方法。当被要求时,容器检查命名 bean 并使用该方法 bean 为了创建(或获取)实际对象,定义包装的配置元数据。

  若使用基础 XML 元数据的配置可以在<bean/> 元素的 class 实例对象的类型(或类)指定在属性中。 。class 属性是Beandefinition实例中的class属性,通常是必要的。您可以使用以下两种方法之一的class属性:

  • 通常,bean是通过反射调用容器本身的结构函数直接创建的 在指定要构造的bean的情况下 类,有点类似于Java使用new操作符 代码。
  • 指定工厂方法的实际类别,包括将被调用来创建对象的工厂方法 ,在容器调用static不常见的情况下,创建类别 bean 的工厂 方法。调用static工厂方法返回的对象类型可能是同一类或另一类。

Spring Bean创建实例化方法:

  • 通过构造函数实例化:Spring容器通过Bean对应类中的默认构造函数实例化Bean。
  • 通过静态工厂方法的实例化:使用静态工厂方法创建禁止对象。该方法可以返回任何类型的Object对象,包括禁止对象本身。
  • 实例工厂方法实例化:用实例工厂方法创建Bean对象,可以返回任何类型的Object对象,包括Bean对象本身。

内部类名

  如果要为 static嵌套类配置 bean 必须使用定义 内部二进制名称。  请注意使用$字符将内部类名与外部类名分开。

3.2 属性赋值

  注入基于构造函数的依赖 它是通过容器调用具有多个参数的构造函数来实现的,每个参数代表一个依赖项。使用特定参数调用static的工厂方法来构建 bean 几乎等价。  基于 Setter 依赖注入是通过容器调用无参数构造函数或无参数static工厂的方法实例化的 bean 后调用 bean 上的 setter 实现方法。

依赖分析过程:

容器执行 bean 依赖分析如下:

  1. 使用applicationcontext描述所有内容 bean 创建和初始化配置元数据。通过 XML、Java 指定代码或注释。
  2. 对于每个 bean,其依赖性以属性、构造函数参数或静态工厂方法(如果使用静态工厂方法而不是普通构造函数)参数的形式表示。这些依赖性是在实践中创建的 bean 时提供给 bean 的 。
  3. 每个属性或构造函数参数都是设置值的实际定义,或者是容器中的另一个值 bean 的引用。
  4. 每个属性或构造函数参数都是一个值,将其指定格式转换为属性或构造函数参数的实际类型。默认情况下,Spring 以字符串格式提供的值可以转换为所有内置类型,如 int, long, String,boolean等。

  Spring 创建容器时,验证每个容器 bean 配置,包括当 bean 引用有效的bean引用属性 时的验证。但是,bean 属性本身实际上创建了bean 时才会设置 。Bean(默认值)是创建单例作用域并设置为预实例化的。当bean的作用域未定义时,bean 仅在被要求时创建。创建 bean 它可能会导致创造 bean 由于图纸的创建和分配, bean 依赖项及其依赖项(等)。).

3.3 初始化

  InitializingBean 接口允许 bean 设置在容器中 bean 初始化工作在执行所有必要属性后进行。  建议不要使用 InitializingBean 因为它会不必要地耦合代码 Spring。或者,使用 注释或指定 POJO 初始化方法。对于基于 XML 配置元数据,您可以使用init-method属性来指定void无参数签名方法的名称。

3.4 销毁

  DisposableBean 接口允许 bean 当包含它的容器被销毁时,回调。  建议不要使用 DisposableBean回调接口,因为它不必要地耦合代码 Spring。或者,使用 注释或指定 bean 定义一般的支持方法。使用基于 XML 配置元数据,您可以 使用destroy-method

  写作时不使用 Spring 特定接口 InitializingBean和 当Disposablebean回调接口的初始化和销毁方法回调时,通常使用init()等、 initialize()、dispose()等方法。理想情况下,这种生命周期回调方法的名称在整个项目中是标准化的,这样所有开发人员都可以使用相同的方法名称,并确保一致性。

  您可以配置Spring 查找命名初始化和销毁每个bean上的回调方法名称 。这意味着你可以作为应用程序开发人员编写应用程序类,并使用init() 初始化回调不需要为每一个回调 bean init定义配置-method="init"属性。Spring IoC 容器在创建 bean 调用此方法(并根据上述标准生命周期回调合同)。该功能还回调了初始化和销毁方法强制执行的命名协议。

  顶级<beans/>元素属性上的default-init-method属性的存在导致 Spring IoC 容器将在 bean 上调的init方法被识别为初始方法回调。创建和组装beann 如果bean 类有这样的方法,会在适当的时候调用。

  使用顶级<beans/>defaultt元素的default-destroy-您可以类似于method属性(在 XML 中)配置销毁方法回调。

  如果现有的 bean 该类别有不同的回调方法,您可以使用它 <bean/ > init-method本身和destroy-method属性指定(即 XML 中)方法名称覆盖默认值。

四、 作用域

  当你创建一个 bean 当定义时,您创建了一个定义 该方法用于创建该方法 bean 类别实例的定义。bean 定义方法的想法很重要,因为这意味着你可以从单个方法中创建许多对象的例子,就像类一样。

  您不仅可以控制从特定插入到特定插入 bean 对创建对象中的各种依赖项和配置值的定义也可以从特定对象中进行控制 bean 定义创建对象的范围。这种方法强大而灵活,因为你可以通过配置来选择你创建的对象的范围,而不是 Java 等级对象的范围。Bean 可定义为部署在多个功能域的一个:开箱即用,Spring 框架支持五个功能域,其中三个只在您使用 web-aware ApplicationContext 时才可用。以下功能域是开箱即用的,也可以创建定制功能域。

bean 的作用域描述singleton(默认)单个 bean 定义的范围限制在每个范围内 Spring IoC 容单个对象实例的设备。单个prototype bean 定义范围仅限于任何数量的对象实例。request将是单一的 bean 定义限制为单个 HTTP 要求的生命周期;也就是说,每一个 HTTP 所有的请求都有自己的 bean 这个例子是单个的 bean 在定义的基础上创建。仅在 web-aware Spring ApplicationContext的上下文是有效的 。sesssion将是单一的 bean 定义限定为 HTTP Session的生命周期。仅在 web-aware Spring ApplicationContext 上下文中有效的global sesssion将是单一的 bean 定义限制为全局 HTTP Session 生命周期。通常仅在 portlet 只有在上下文中使用才有效。仅在 web-aware Spring ApplicationContext 上下文有效 。

自定义功能域:可以定义自己的功能域,甚至可以重新定义现有的功能域,虽然后者被认为是不好的做法,但不能 覆盖内置singleton和内置singleton prototype的作用域。

在这里插入图片描述

  如果你喜欢,欢迎