Spring 中的 Bean

这篇具有很好参考价值的文章主要介绍了Spring 中的 Bean。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

欢迎来到本篇文章,鸽了好久了,今天继续写下 Spring 的内容:Spring 中 Bean 的基本概念、基本写法和 3 种实例化 Bean 的方式等。

什么是 Bean?

我们回顾下,什么是 Bean?这在上一篇文章 Spring 核心概念之一 IoC 中说过了,简而言之,一句话:被 Spring IoC 管理的对象,就是 Bean。

一个 Spring IoC 容器中管理着一个或多个 Bean,这些 Bean 是由我们提供给容器的配置元数据创建的(比如以 XML <bean /> 形式定义的 Bean)。

「Bean Definition」的属性

在容器本身中,这些 Bean 定义被表示为 BeanDefinition 对象,它包含(除其他信息外)以下元数据(metadata)。

  • 一个全路径类名:比如 cn.god23bin.demo.controller.DemoController,这就是 Bean Definition 的实际实现类。
  • Bean 的行为配置元素:它说明了 Bean 在容器中的行为方式(比如 scope、生命周期回调等等)。
  • 对其他 Bean 的引用:这些被引用的 Bean 被称为协作者或依赖(collaborators or dependencies)。
  • 其他配置的设置:比如,数据库连接池的大小限制或使用的连接数。

这些元数据对应着每个 Bean Definition 的一组属性。下表描述了这些属性:

属性 解释…
Class 该属性是必需的,它指定了用于创建 bean 的 bean 类。
Name 该属性唯一地指定 bean 标识符。 在基于 XML 的配置元数据中,我们可以使用 id 或 name 属性来指定 bean 标识符。
Scope 该属性指定从特定 bean 定义创建的对象的范围,将在 bean 范围一章中讨论。
Constructor arguments 这用于注入依赖关系,将在后续章节中讨论。
Properties 这用于注入依赖关系,将在后续章节中讨论。
Autowiring mode 这用于注入依赖关系,将在后续章节中讨论。
Lazy initialization mode 懒加载模式,让 bean 告诉 IoC 容器在第一次被请求时创建一个 bean 实例,而不是在启动时。
Initialization method 在容器设置了 bean 上的所有必要属性之后调用的回调。 它将在 bean 生命周期章节中讨论。
Destruction method 当包含 bean 的容器被销毁时要使用的回调。 它将在 bean 生命周期章节中讨论。

Bean 的命名

以 XML 作为配置元数据的方式中,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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="..." class="...">  
        <!-- 该 bean 的协作者和配置写在此处 -->
    </bean>

    <bean id="..." class="...">
        <!-- 该 bean 的协作者和配置写在此处 -->
    </bean>

    <!-- 更多的 bean 定义写在此处 -->

</beans>

XML 中类似 <bean/> 由尖括号组成的写法,一般称为「标签」或者「元素」,在后面的说法中,可能有时出现标签的说法或者元素的说法,实际上都是指同一个东西,后续便不再说明

我们可以看到,bean 标签有 idclass 属性。

这个 id 是每个 Bean 都有的一个标识符(identifier),这些标识符在 Spring IoC 容器中必须是唯一的

一个 Bean 一般只有一个标识符。如果它需要一个以上的标识符,那么多余的标识符可以被视为别名

在基于 XML 的配置元数据中,我们可以使用 id 属性、name 属性或两者来指定 Bean 的标识符。

命名习惯

习惯上,这里对于 Bean 定义的命名和对于我们命名 Java 类中的属性名是一样的,就是驼峰命名,小写字母开头。比如 userServiceuserDaologinController 等等。

还有,如果想起多个别名,那么用 name 属性指定别名是什么,比如 name="别名1,别名2,别名3",多个别名之间可以用英文逗号、英文分号或者空格分隔。

Bean 的别名

除了使用 Bean 定义中的 name 属性来对 Bean 起别名,还可以使用 alias 标签给 Bean 起别名:

<bean id = "userService" name="userServiceName" ... ></bean>
<alias name="userServiceName" alias="userServiceAliasName" />

这样,名为 userServiceName 的 Bean 也有了另一个名字:userServiceAliasName

Spring 实例化 Bean 的 3 种方式

Spring 可以通过 3 种方式来为我们创建 Bean 对象,创建的对象是根据我们定义的配置元数据来进行创建的。

这 3 种方式分别是:

  1. 通过构造方法实例化
  2. 通过静态工厂方法实例化
  3. 通过实例工厂方法实例化

在上面的 Bean 定义的属性中,我们也看到了,在 <bean /> 中有一个 class 属性,就是用来指定要实例化的对象的类型的。一般情况下,这个 class 属性是必须写的,除非是通过实例工厂方法实例化的 Bean,那么它的 Bean 定义可以不需要 class 属性

1. 通过构造方法实例化

以 XML 为配置元数据为例,在默认的情况下,我们定义的 Bean 都是以构造方法来实例化 Bean 对象的。

这些交给 Spring 管理的 Bean,不需要实现 Spring 的某某接口或者继承 Spring 的某某类,只需要有一个无参的构造方法,就可以了。

这里也是 Spring 低侵入的特点,我们的类根本不需要去实现 Spring 特定的接口或继承特定的类进而实现 IoC 的功能。

<bean id="fans" class="cn.god23bin.demo.domain.entity.Fans">
    <property name="name" value="god23bin" />
</bean>

以上面这个例子来说,这样定义的 Bean 就是通过 cn.god23bin.demo.domain.entity.Fans 的构造方法实例化的:

package cn.god23bin.demo.domain.entity;

public class Fans {
    private String name;

    public Fans() {
        System.out.println("粉丝无参构造方法被调用了!");
    }

    // 省略 getter 和 setter
}

从 Spring IoC 容器中获取被管理的 Fans 对象,这个过程,Spring 就会根据配置元数据去使用构造方法实例化 Fans 对象。

测试:

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Fans fans = applicationContext.getBean(Fans.class);
System.out.println("fans name: " + fans.getName());

输出:

粉丝无参构造方法被调用了!
fans name: god23bin

2. 通过静态工厂方法实例化

假设我们有一些对象是从静态工厂中获取对象的,有一个静态工厂类,类中定义了一个静态方法,该方法是创建对象的:

package cn.god23bin.demo.domain.entity.factory;

import cn.god23bin.demo.domain.entity.Fans;

public class FansStaticFactory {
    // 返回 Fans 对象的静态方法
    public static Fans createFansInstance() {
        System.out.println("粉丝静态工厂!");
        Fans fans = new Fans();
        fans.setName("练习两年半 | 你干嘛哎哟~~");
        return fans;
    }
}

接着在配置元数据中定义 Bean,将通过调用工厂的静态方法来创建 Bean 对象,使用 class 属性指定包含了静态工厂方法的类,使用 factory-method 属性指定创建对象的静态方法:

<bean id="fans" class="cn.god23bin.demo.domain.entity.factory.FansStaticFactory" factory-method="createFansInstance" />

测试:

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Fans fans = applicationContext.getBean(Fans.class);
System.out.println("fans name: " + fans.getName());

输出:

粉丝静态工厂!
粉丝无参构造方法被调用了!
fans name: 练习两年半 | 你干嘛哎哟~~

3. 通过实例工厂方法实例化

实例工厂:

package cn.god23bin.demo.domain.entity.factory;

import cn.god23bin.demo.domain.entity.Fans;

public class FansFactory {
    public FansFactory() {
    }

    public Fans createFansInstance() {
        System.out.println("粉丝工厂");
        Fans fans = new Fans();
        fans.setName("练习两年半 | 你干嘛哎哟~~ | 记得关注我噢~");
        return fans;
    }
}

和静态工厂实例化 Bean 对象类似,我们这里用实例厂方法进行 Bean 的实例化,从 Spring IoC 容器中调用现有工厂 Bean 的非静态方法来创建一个新的 Bean。

这里需要注意 Fans 这个 Bean 的 class 属性是不需要的。

<!-- 配置实例工厂 Bean,该对象包含了创建 Fans 对象的名为 createFansInstance 的方法 -->
<bean id="fansFactory" class="cn.god23bin.demo.domain.entity.factory.FansFactory">
    <!-- 工厂的其他需要的依赖对象就配置在这里 -->
</bean>

<!-- 这个 Bean 将通过实例工厂创建 -->
<bean id="fans" factory-bean="fansFactory" factory-method="createFansInstance" />

总结

以上,就是本文的所有内容,主要介绍了 Spring 中 Bean 的概念和 Bean 的定义属性。

Bean 由配置元数据创建,比如以XML形式定义的 Bean。Bean 在容器中由 BeanDefinition 对象表示,它包含类名、行为配置元素、对其他 Bean 的引用以及其他配置设置等元数据属性。

Bean 的命名方式一般就是驼峰命名的。在基于XML的配置元数据中,可以使用 id 属性或 name 属性来指定 Bean 的标识符,Bean 的别名可以使用 alias 标签进行定义。

最后,我们说了 Spring 实例化 Bean 的三种方式:通过构造方法实例化、通过静态工厂方法实例化和通过实例工厂方法实例化。

当然,Bean 的内容不止这些,本文是对 Bean 的初步介绍。下一篇我们将介绍 Bean 之间的依赖关系,通过依赖注入来实现 Bean 之间的相互依赖。

最后的最后

希望各位屏幕前的靓仔靓女们给个三连!你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!

咱们下期再见!文章来源地址https://www.toymoban.com/news/detail-497010.html

到了这里,关于Spring 中的 Bean的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 欢迎来到Web3.0的世界:Solidity智能合约安全漏洞分析

    智能合约是运行在区块链网络中的一段程序,经由多方机构自动执行预先设定的逻辑,程序执行后,网络上的最终状态将不可改变。智能合约本质上是传统合约的数字版本,由去中心化的计算机网络执行,而不是由政府或银行等中央集权机构执行。智能合约程序可以用Solidi

    2024年02月03日
    浏览(45)
  • GitHub Copilot 使用攻略,本篇文章作者是GPT-3.5

    引言: 在软件开发领域,编写高质量的代码是开发者们的永恒追求。然而,传统的编码过程常常耗费大量时间和精力,而且在遇到复杂的问题时,开发者可能会面临困惑和不确定性。为了解决这些挑战,GitHub推出了一款强大的工具——GitHub Copilot,它利用人工智能技术提供智

    2024年02月16日
    浏览(59)
  • 智能合约协议和提案(文章不断跟新,欢迎评论补充&纠正!)

    描述 : ERC-20是基于以太坊区块链技术的一种代币标准协议。它规定了一系列的规范和接口,使得不同的代币可以在以太坊网络上遵循同样的规则,从而实现互操作性和互换性。这种标准协议对于以太坊生态系统的发展起到了重要的推动作用,为众多区块链项目提供了代币发

    2024年04月29日
    浏览(41)
  • 从零开始学Spring Boot系列-前言

    在数字化和信息化的时代,Java作为一种成熟、稳定且广泛应用的编程语言,已经成为构建企业级应用的首选。而在Java生态系统中,Spring框架无疑是其中最为耀眼的一颗明星。它提供了全面的编程和配置模型,用于构建企业级应用。随着Spring Boot的出现,这一框架变得更加易于

    2024年02月22日
    浏览(59)
  • 初入公司用不好git ?-- 本篇针对GitLab

    本篇并不涉及git的所有知识,内容包括工作中每天用到的以及需要知道的 一、从远程仓库拉取指定分支到本地仓库,并创建个人分支  二、(补充)基于以上补充几点基础知识点以便你更好理解并实践 1. 主分支:通常是master分支 2. 开发分支:基于主分支派生,你通常在这个

    2024年02月05日
    浏览(48)
  • Spring Boot 笔记 028 文章列表

    1.1 导入中文语言包 1.2 显示文章分类 1.3.1 article.js增加文章列表接口 1.3.2 页面调用接口显示数据 1.3.3 表单绑定categoryname 1.3.4 搜索按钮,重置按钮,分页按钮 1.4 添加文章按钮 1.4.1 编辑页面,绑定数据,添加样式 1.4.2 文本编辑器 1.4.2.1 安装vue-quill 1.4.2.2 导入组件和样式 1.4.2

    2024年02月21日
    浏览(37)
  • Spring boot+Vue博客平台:文章列表展示、文章分类与标签管理模块实现

    本文将详细介绍如何实现博客平台中的文章列表展示、文章分类与标签管理功能,包括前端的Vue组件设计和后端的Spring Boot接口实现。在阅读本文后,您将了解如何设计和实现高效、易用的文章列表展示、文章分类与标签管理功能。 1.设计思路 在设计文章列表展示功能时,我

    2023年04月11日
    浏览(55)
  • Spring Boot 笔记 026 文章分类列表查询

    1.1 pinia 1.1.1 安装pinia npm install pinia 1.1.2 安装persist npm install pinia-persistedstate-plugin 1.1.2 在vue应用实例中使用pinia,在pinia中使用persist 1.1.3 在src/stores/token.js中定义store,定义状态Store时指定持久化配置参数 1.1.4 在组件中使用store 1.1.4.1 在login.vue中使用store将token存储到pinia中  

    2024年02月20日
    浏览(44)
  • MCU+DSP,当下主流的架构设计,来到21569这里,应该如何去实现?

    作者的话 当下的音频DSP设计中,我们习惯于MCU+DSP的架构。DSP做音效,MCU做上位机,做控制,这种搭配的组合是非常成熟的,那么他的底层逻辑是什么?怎么才能实现? 实现逻辑 我们以ADI的SHARC系列DSP来讲的话,21569在之前的调音台、车载DSP的应用中,已经展现的淋漓尽致。

    2024年01月19日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包