Spring Framework 中 BeanDefinition 是什么

BeanDefinition 是 Spring Framework 中一个核心的接口,它描述了一个 Bean 的定义。你可以把它看作是 Spring IoC 容器中 Bean 的“蓝图”或“配置元数据”。它包含了 Spring 容器创建、配置和管理 Bean 所需的所有信息。

BeanDefinition 中包含的信息:

  • Bean 的类名 (Class Name): Bean 的全限定类名(例如,com.example.MyService)。

  • Bean 的作用域 (Scope): 指定 Bean 的生命周期和可见性。常见的作用域有:

    • singleton (默认): 在 Spring 容器中只有一个 Bean 实例。
    • prototype: 每次请求 Bean 时都会创建一个新的实例。
    • request: 在 Web 应用中,每个 HTTP 请求都有一个 Bean 实例。
    • session: 在 Web 应用中,每个 HTTP 会话有一个 Bean 实例。
    • application: 在 Web 应用中,每个 ServletContext 有一个 Bean 实例。
    • globalSession: 在 Portlet 应用中,每个全局会话有一个 Bean 实例。
    • 自定义作用域
  • Bean 的构造函数参数 (Constructor Arguments): 用于构造函数注入的参数值。

    • 可以通过索引或类型指定参数。
    • 可以是字面量值、对其他 Bean 的引用、集合等。
  • Bean 的属性值 (Property Values): 用于 Setter 方法注入的属性值。

    • 可以是字面量值、对其他 Bean 的引用、集合等。
  • Bean 的依赖关系 (Dependencies): 该 Bean 所依赖的其他 Bean(通过 depends-on 属性或自动装配指定)。

  • Bean 的初始化方法 (Init Method): 在 Bean 实例化和属性设置完成后调用的方法。

    • 可以通过 @PostConstruct 注解指定。
    • 可以通过实现 InitializingBean 接口的 afterPropertiesSet 方法指定。
    • 可以在 XML 配置中使用 init-method 属性指定。
  • Bean 的销毁方法 (Destroy Method): 在 Bean 被销毁之前调用的方法。

    • 可以通过 @PreDestroy 注解指定。
    • 可以通过实现 DisposableBean 接口的 destroy 方法指定。
    • 可以在 XML 配置中使用 destroy-method 属性指定。
  • Bean 是否是懒加载 (Lazy Initialization): 是否在容器启动时立即创建 Bean,还是在第一次请求时才创建(默认为 false,即立即创建)。

  • Bean 的自动装配模式 (Autowiring Mode): 如何自动解析和注入 Bean 的依赖关系。

    • no (默认): 不自动装配。
    • byName: 根据 Bean 的名称自动装配。
    • byType: 根据 Bean 的类型自动装配。
    • constructor: 类似于 byType,但应用于构造函数参数。
    • autodetect: 已过时, Spring 3.0 之前使用.
  • Bean 的名称 (Bean Name/ID): 用于在容器中唯一标识 Bean。

    • 如果没有指定名称,Spring 会自动生成一个唯一的名称。
  • Bean 的别名 (Aliases): 其他可以用来引用该 Bean 的名称。

  • 是否是抽象 Bean (Abstract): 抽象 Bean 不能被实例化,通常用作模板。

  • 是否是单例 (Singleton): 指示 Bean 是否是单例(truefalse,与 scope 属性可能重复)。

  • 是否是原型 (Prototype): 指示 Bean 是否是原型。

  • 是否是主要候选者 (Primary): 当多个 Bean 满足自动装配条件时,优先选择主要候选者。

  • FactoryBean Name: 如果 Bean 是一个 FactoryBean,可以使用 & + Bean 名称来引用 FactoryBean 本身,而不是它创建的对象。

  • 其他元数据: 例如,Bean 的描述信息、角色提示(ROLE_APPLICATIONROLE_SUPPORTROLE_INFRASTRUCTURE)、方法覆盖(MethodOverrides)等。

BeanDefinition 的主要实现类:

  • RootBeanDefinition: 根 Bean 定义,通常用于定义普通的 Bean。
  • ChildBeanDefinition: 子 Bean 定义,继承自父 Bean 定义,可以覆盖或添加一些属性。
  • GenericBeanDefinition: 通用的 Bean 定义,可以独立使用,也可以作为父 Bean 定义。
  • ScannedGenericBeanDefinition: GenericBeanDefinition 的子类,用于通过类路径扫描(@Component@Service 等)生成的 Bean 定义。
  • AnnotatedBeanDefinition: 带有注解信息的 Bean 定义的接口。
    • AnnotatedGenericBeanDefinition: 通用的带有注解信息的 Bean 定义.
    • ConfigurationClassBeanDefinition: 表示由 @Configuration 类中的 @Bean 方法定义的 Bean。

BeanDefinition 的作用:

  • 存储 Bean 的元数据: BeanDefinition 对象保存了创建和配置 Bean 所需的所有信息。
  • 作为 Bean 的模板: Spring 容器根据 BeanDefinition 来创建 Bean 的实例。
  • 支持 Bean 的继承: 子 Bean 定义可以继承父 Bean 定义,减少配置的重复。
  • 支持 Bean 的修改: BeanFactoryPostProcessor 可以在 Bean 实例化之前修改 BeanDefinition

获取 BeanDefinition

可以通过 BeanFactoryBeanDefinitionRegistry 的以下方法获取 BeanDefinition

  • BeanFactory.getBeanDefinition(String beanName)
  • BeanDefinitionRegistry.getBeanDefinition(String beanName)
  • BeanDefinitionRegistry.getBeanDefinitionNames() (获取所有 Bean 定义的名称)
  • BeanDefinitionRegistry.containsBeanDefinition(String beanName)

示例 (编程式创建 BeanDefinition):

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;public class BeanDefinitionExample {public static void main(String[] args) {// 创建 RootBeanDefinitionRootBeanDefinition beanDefinition = new RootBeanDefinition();beanDefinition.setBeanClass(MyService.class); // 设置 Bean 的类beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON); // 设置作用域beanDefinition.setLazyInit(false); // 设置是否懒加载beanDefinition.setInitMethodName("init"); // 设置初始化方法beanDefinition.setDestroyMethodName("cleanup"); // 设置销毁方法// ... 设置其他属性 ...// 可以将 beanDefinition 注册到 BeanDefinitionRegistry (例如 DefaultListableBeanFactory)// ...}static class MyService {public void init() {System.out.println("MyService initialized");}public void cleanup() {System.out.println("MyService destroyed");}}
}

总结:

BeanDefinition 是 Spring 中描述 Bean 的核心接口。它包含了创建、配置和管理 Bean 所需的所有元数据。 Spring 容器根据 BeanDefinition 来创建 Bean 的实例,并管理它们的生命周期。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QtCreator16创建WebAssembly工程在浏览器中显示图片

显示效果: 实现过程: 添加qrc资源文件 输入文件名: 选择模板为Qt Resource File 在工程目录下创建res文件夹,复制图片文件到res中 编辑qrc文件 添加资源前缀 添加图片资源 选择图片资源添加别名 复制资源URL 使用别名调用资源 居…

openpnp - 如果安装面的钣金接触面不平,可以尝试加垫片

文章目录 openpnp - 如果安装面的钣金接触面不平,可以尝试加垫片概述吐槽备注END openpnp - 如果安装面的钣金接触面不平,可以尝试加垫片 概述 在X轴导轨上,架上百分表,打设备的工作平面的平面度,发现工作平面不平(和…

人工智能之数学基础:线性方程组

本文重点 线性方程组是由两个或两个以上的线性方程组成的方程组,其中每个方程都是关于两个或两个以上未知数的线性方程。 记忆恢复 我们先从小学学习的线性方程组找到感觉 解答过程: 将第二个方程乘以2,得到: 2x−2y=2 将第一个方程减去新得到的方程,消去x: (2x+y)−…

DeepSeek-R1思路训练多模态大模型-Vision-R1开源及实现方法思路

刚开始琢磨使用DeepSeek-R1风格训练多模态R1模型,就看到这个工作,本文一起看看,供参考。 先提出问题,仅靠 RL 是否足以激励 MLLM 的推理能力? 结论:不能,因为如果 RL 能有效激励推理能力&#…

鸿蒙NEXT项目实战-百得知识库04

代码仓地址,大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点: 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…

免密登录远程服务器shell脚本

一、脚本代码 #!/bin/bash #提示用户输入用户i名和ip地址 read -p "请输入远程服务器的用户名: " hname read -p "请输入远程服务器的IP地址: " fip read -p "请输入远程服务器的远程端口:" sdk #检查是否配置了免密登录 function sfmm(){ …

WiFi 定位技术:守护宠物安全的隐形卫士

一、实时追踪,防患未然 想象一下,活泼好动的猫咪趁你开门瞬间溜出家门,穿梭在楼道杂物间;或是狗狗在户外玩耍时,被突发声响惊吓狂奔,瞬间没了踪影。在这些令人揪心的时刻,WiFi 定位技术就像给宠…

《C#上位机开发从门外到门内》3-2::Modbus数据采集系统

文章目录 **1. 项目概述****1.1 项目背景****1.2 项目目标****1.3 技术栈** **2. 系统架构设计****2.1 系统架构图****2.2 模块功能** **3. 数据采集模块实现****3.1 Modbus协议简介****3.2 数据采集流程****3.3 代码实现** **4. 数据存储模块实现****4.1 数据库设计****4.2 数…

Carto 无尽旅图 for Mac v1.0.7.6 (51528)冒险解谜游戏 支持M、Intel芯片

游戏介绍 《Carto》源于英文"Cartographer"(制图师),卡朵不慎坠入未知世界。这里蜿蜒曲折,地形丰富。作为制图师卡朵,你将用你自己的神秘力量,操纵地图颠覆世界,将其翻转、拼合。当世…

点击劫持详细透析

点击劫持(Clickjacking)是一种前端安全攻击手段,攻击者通过视觉欺骗诱导用户在不知情的情况下点击隐藏的页面元素,从而执行非预期的操作。以下是攻击过程的详细说明: 攻击过程步骤 攻击者构造恶意页面 创建一个恶意网页…

OpenAI--Agent SDK简介

项目概述 OpenAI Agents SDK 是一个轻量级但功能强大的框架,用于构建多智能体工作流。它主要利用大语言模型(LLM),通过配置智能体、交接、护栏和跟踪等功能,实现复杂的工作流管理。以下是对其各个部分运行过程和代码流…

【】序列操作

A. Tower 彭教授建造了 n n n 个不同高度的积木塔。其中 i i i 个塔的高度为 a i a_i ai​ 。 寿教授不喜欢这些塔,因为它们的高度太随意了。他决定先移除其中的 m m m 个,然后执行下面的一些操作(或不执行): 选…

QwQ-32B 模型结构

QwQ-32B 是一种基于 Transformer 架构 的大型语言模型(LLM),由阿里巴巴的 Qwen 团队开发,专注于推理任务。以下是其核心结构和技术特点: 1. 基础架构 Transformer 结构:QwQ-32B 采用多层 Transformer 架构…

【Linux】:自定义协议(应用层)

朋友们、伙计们,我们又见面了,本期来给大家带来应用层自定义协议相关的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通…

【C++】二叉树和堆的链式结构

本篇博客给大家带来的是用C语言来实现堆链式结构和二叉树的实现! 🐟🐟文章专栏:数据结构 🚀🚀若有问题评论区下讨论,我会及时回答 ❤❤欢迎大家点赞、收藏、分享! 今日思想&#xff…

鸿蒙保姆级教学

鸿蒙(HarmonyOS)是华为推出的一款面向全场景的分布式操作系统,支持手机、平板、智能穿戴、智能家居、车载设备等多种设备。鸿蒙系统的核心特点是分布式架构、一次开发多端部署和高性能。以下是从入门到大神级别的鸿蒙开发深度分析&#xff0c…

关于Docker是否被淘汰虚拟机实现连接虚拟专用网络Ubuntu 22.04 LTS部署Harbor仓库全流程

1.今天的第一个主题: 第一个主题是关于Docker是否真的被K8S弃用,还是可以继续兼容,因为我们知道在去年的时候,由于不可控的原因,docker的所有国内镜像源都被Ban了,再加上K8S自从V1.20之后,宣布…

八股学习-JUC java并发编程

本文仅供个人学习使用,参考资料:JMM(Java 内存模型)详解 | JavaGuide 线程基础概念 用户线程:由用户空间程序管理和调度的线程,运行在用户空间。 内核线程:由操作系统内核管理和调度的线程&…

遗传算法+四模型+双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测

遗传算法四模型双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 遗传算法四模型双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于GA-CNN-BiLSTM-Attention、CNN-BiL…

Linux怎样源码安装Nginx

1. 安装必要的依赖 在编译 Nginx 之前,你需要安装一些必要的依赖包,像编译工具和库文件等。以 CentOS 系统为例,可借助yum命令来安装: bash sudo yum install -y gcc pcre-devel zlib-devel openssl-devel要是使用的是 Ubuntu 系…