01-创建简单的Bean容器

第 02 章:小试牛刀,实现一个简单的Bean容器 作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 一、前言 上学时,老师总说:不会你就问,但多数时候都不知道要问什么! 你总会在小傅哥的文章前言里,发现一些关于成长、学习、感悟以及对当篇内容的一个介绍,其实之所以写这样的铺垫性内容,主要是为了让大家对接下来的内容学习有一个较轻松的开场和过度。 就像我们上学时如果某一科的内容不会时,老师经常会说,你有不会的就要问。但对于学生本身来讲,可能已经不会的太多了,或者压根不知道自己不会什么,只有等看到 阅读详情

实现一个简单的Bean容器

Spring Bean 容器是什么?

Spring 包含并管理应用对象的配置和生命周期,在这个意义上它是一种用于承载对象的容器,你可以配置你的每个 Bean 对象是如何被创建的,这些 Bean 可以创建一个单独的实例或者每次需要时都生成一个新的实例,以及它们是如何相互关联构建和使用的。

如果一个 Bean 对象交给 Spring 容器管理,那么这个 Bean 对象就应该以类似零件的方式被拆解后存放到 Bean 的定义中,这样相当于一种把对象解耦的操作,可以由 Spring 更加容易的管理,就像处理循环依赖等操作。

当一个 Bean 对象被定义存放以后,再由 Spring 统一进行装配,这个过程包括 Bean 的初始化、属性填充等,最终我们就可以完整的使用一个 Bean 实例化后的对象了。

思路

凡是可以存放数据的具体数据结构实现,都可以称之为容器。例如:ArrayList、LinkedList、HashSet等,但在 Spring Bean 容器的场景下,我们需要一种可以用于存放和名称索引式的数据结构,所以选择 HashMap 是最合适不过的。

HashMap 是一种基于扰动函数、负载因子、红黑树转换等技术内容,形成的拉链寻址的数据结构,它能让数据更加散列的分布在哈希桶以及碰撞时形成的链表和红黑树上。它的数据结构会尽可能最大限度的让整个数据读取的复杂度在 O(1) ~ O(Logn) ~O(n)之间,当然在极端情况下也会有 O(n) 链表查找数据较多的情况。不过我们经过10万数据的扰动函数再寻址验证测试,数据会均匀的散列在各个哈希桶索引上,所以 HashMap 非常适合用在 Spring Bean 的容器实现上。

一个简单的 Spring Bean 容器实现,还需 Bean 的定义、注册、获取三个基本步骤,简化设计如下;
设计架构

  • 定义:BeanDefinition,可能这是你在查阅 Spring 源码时经常看到的一个类,例如它会包括 singleton、prototype、BeanClassName 等。但目前我们初步实现会更加简单的处理,只定义一个 Object 类型用于存放对象。
  • 注册:这个过程就相当于我们把数据存放到 HashMap 中,只不过现在 HashMap 存放的是定义了的 Bean 的对象信息。
  • 获取:最后就是获取对象,Bean 的名字就是key,Spring 容器初始化好 Bean 以后,就可以直接获取了。

实现

1.代码目录

small-spring-step-01
└── src
    ├── main
    │   └── java
    │       └── cn.strongwind.springframework
    │           ├── BeanDefinition.java
    │           └── BeanFactory.java
    └── test
        └── java
            └── cn.strongwind.springframework.test  
                ├── bean
                │   └── UserService.java                
                └── ApiTest.java

Spring Bean 容器的整个实现内容非常简单,也仅仅是包括了一个简单的 BeanFactory 和 BeanDefinition,这里的类名称是与 Spring 源码中一致,只不过现在的类实现会相对来说更简化一些,在后续的实现过程中再不断的添加内容。

  • BeanDefinition,用于定义 Bean 实例化信息,现在的实现是以一个 Object 存放对象
  • BeanFactory,代表了 Bean 对象的工厂,可以存放 Bean 定义到 Map 中以及获取。

2.Bean定义

public class BeanDefinition {

    private Object bean;

    public BeanDefinition(Object bean) {
        this.bean = bean;
    }

    public Object getBean() {
        return bean;
    }

}

  • 目前的 Bean 定义中,只有一个 Object 用于存放 Bean 对象。如果感兴趣可以参考 Spring 源码中这个类的信息,名称都是一样的。
  • 不过在后面陆续的实现中会逐步完善 BeanDefinition 相关属性的填充,例如:SCOPE_SINGLETON、SCOPE_PROTOTYPE、ROLE_APPLICATION、ROLE_SUPPORT、ROLE_INFRASTRUCTURE 以及 Bean Class 信息。

3.Bean工厂

public class BeanFactory {

    private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();

    public Object getBean(String name) {
        return beanDefinitionMap.get(name).getBean();
    }

    public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
        beanDefinitionMap.put(name, beanDefinition);
    }

}

  • 在 Bean 工厂的实现中,包括了 Bean 的注册,这里注册的是 Bean 的定义信息。同时在这个类中还包括了获取 Bean 的操作。
  • 目前的 BeanFactory 仍然是非常简化的实现,但这种简化的实现内容也是整个 Spring 容器中关于 Bean 使用的最终体现结果,只不过实现过程只展示出基本的核心原理。在后续的补充实现中,这个会不断变得庞大。

参考链接:创建一个简单的Bean容器

prometheus普罗米修斯集监控外部k8s 阅读详情

相关推荐

智能车竞赛必备:STC32G144K开源库实战指南(含总钻风摄像头配置)

本文为智能车竞赛参赛者提供了一份基于STC32G144K微控制器与逐飞开源库的实战开发指南。文章详细介绍了从开发环境搭建、总钻风摄像头驱动配置与图像采集优化,到核心控制算法实现与多任务调度等关键步骤,旨在帮助队伍快速构建稳定高效的视觉处理系统,提升竞赛竞争力。

weixin_29191081的博客 712

Spring ——Bean(IOC)容器

spring framework——Bean容器 为什么需要Bean容器? 一般的项目搭建,都需要将各层进行分离以降低代码之间的耦合度。比如我们常用Dao层(数据访问层)、service层来封装和数据库的交互部分,其中Dao层负责具体的增删查改,service层负责调用Dao层的方法来对外提供服务。例如: 使用这种方法调用数据库,相当于将对象放到了方法中,此时对象对应的变量(局部变量)随着栈帧的创建而出现,随着栈帧的退出而销毁。那么由于没有引用指向它,该对象就会很快变成可回收状态。如果对象的创建初始化较为

长不大的大灰狼 2459

基于STM32的便携式心率血氧监测系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6核心控制器,完整实现了便携式心率血氧监测系统的全功能开发,覆盖MAX30102光电传感器驱动、PPG信号处理、心率血氧解算算法、人机交互、数据存储、报警保护、低功耗管理等核心功能,全程采用无跳步保姆式教学,从硬件选型、接线、CubeMX配置、代码开发、调试优化全流程拆解,跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 767

Spring源码解析(二):bean容器的创建、注册默认后置处理器、bean定义扫描类

}//创建注解容器,入参为配置类 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config . class);//获取某个bean Book book = context . getBean(Book . class);//关闭容器 context . close();} }调用ClassPathBeanDefinitionScanner的有参构造方法。

从基础到源码解析的学习记录 1883

Spacedesk保姆级教程:用旧平板给Windows电脑当副屏,从安装到避坑一步到位

本文提供Spacedesk保姆级教程,教你如何将旧平板变成Windows电脑的副屏,从软件安装到网络配置、显示优化及声音交互,一步步避开常见陷阱。通过WiFi实现扩展屏功能,支持4K分辨率和60Hz刷新率,让闲置设备焕发新生。

weixin_42524945的博客 1万+

Tesseract in Java - Intellij IDEA对Tess4J的配置和使用

最近要弄OCR,搜到这个,官网全英文,很烦,看看有没有中文的博客介绍,擦,一个比一个奇葩,还是自己按照官方的来吧,外网慢的很,传到csdn给大家下载。中文训练库下载地址: http://download.youkuaiyun.com/detail/d_dmelon/9916532Tess4J3.4下载地址: http://download.youkuaiyun.com/detail/d_dmelon/9916519安装

Lewis的博客 1万+

Bean注入容器的多种方式

bean注入容器

u014365523的博客 3493

SAP Fiori Launchpad 上看不到任何 tile 应该怎么办?

中心UI组件是一个框架,为所有SAPFiori应用程序提供公共基础设施SAPFiorilaunchpad是所有SAPFioriUI的基础,并为SAPFiori应用程序提供基本功能,如登录,界面大小,应用程序之间的导航,和基于角色的应用程序目录。ABAP前端服务器包含所有基础设施组件,用于为客户端生成SAPFiori应用程序特定的UI,并与SAPBusinessSuite后端系统通信。SAPFiori应用程序的处理过程如下首先,客户端加载SAPFiori应用程序的界面。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 941

Spring从零开始学使用系列(五)--Bean定义继承与容器扩展点

Bean定义继承允许开发者通过“模板”Bean简化共同配置,从而提高配置的复用性和可维护性。这类似于面向对象编程中的类继承,但专注于配置而非行为。掌握Spring的这些高级功能将使您能够构建更加健壮、可维护和灵活的企业级应用。随着对这些功能的深入理解和实践。

程序员LSP 674

CATIA V6二次开发——如何利用CaptureToFile截屏

CaptureToFile 今天给大家分享一个很有趣的功能,如何利用CATIA自带的功能输出模型展示图? 先上方法: 方法本身并不难,只需要赋予格式及输出路径即可完成该功能。结果如下: 看到这样一张图片不禁让我陷入了沉思,怎么会这么丑???? 那么如何让这个简单的功能变得有趣,图片变得好看点呢? 第一步:背景换色 第二步:隐藏结构树 ...

WorkMan的博客 2982

[SV]SystemVerilog学习笔记之struct & union

SystemVerilog学习笔记(四) 一、结构体(struct) 1.1、结构体(struct) 结构体声明:结构体默认是变量,也可以声明为线网 var struct{ //通过var进行结构体变量声明 logic [31:0] a, b; logic [ 7:0] opcode; } Instruction_Word_var; wire struct{ //结构体线网声明,定义为线网类型时,结构体的所有成员必须...

元直的博客 1万+

Spring中管理bean的容器-IOC容器

不管使用哪种具体的ApplicationContext实现,它们都负责创建、组装和管理应用程序中的bean,实现了IoC容器的功能。在Spring中,bean是由容器创建、组装和管理的对象。Spring容器使用依赖注入(DI)来管理bean之间的依赖关系,使得对象之间的耦合度降低,提高了代码的可维护性和可测试性。它提供了一个强大的IoC(控制反转)容器,用于管理应用程序中的对象,这个容器也称为Spring容器。它从类路径下的XML配置文件加载应用的配置信息,并根据配置文件中的定义创建和管理bean实例。

qq_46130027的博客 286

科研级YOLOv8 Neck革新:BiFPN双向特征金字塔赋能,让多尺度融合更高效的实战指南

在文件夹下新建BiFPN.py,将上述BiFPNLayer和BiFPN类的代码写入其中。这一步是为了让YOLOv8的代码架构能识别我们的自定义Neck模块。

m0_64661770的博客 153

手撸spring01: 创建简单Bean容器

spring是怎么去管理bean的呢?学习一下手撸spring. 第一步先来简单的实现一个Bean容器的注册与获取 所谓容器就是能够存储元素的结构就是容器, 例如List, Set 和Map 在Spring Bean容器的场景下, 需要存放名称为索引的数据结构, HashMap就是个合适的选择, 工厂模式一般也都是这么搞的. 先画个图 那个Bean没有那么重要,第一步先来创建BeanDefinition,因为是简单版,一开始就只有一个bean,后续会慢慢加入其他的属性 /** * 定义一个bean

weixin_45369440的博客 663

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

如何自己实现一个简单的 Spring Bean 容器

在目前的 Bean 对象定义中,只有一个 Object 类型,因为它是所有类型的父类,可以存储任意类型的 Bean 对象。就像将一个沙发左移、套个沙发罩、盖上一块布,再铺个小坐垫,沙发套、盖布、坐垫对初学源码的开发者来说,并没有那么重要,我们要了解的是最初的沙发、最开始的木板,看看它的结构、闻闻它的味道。BeanFactory 类是用于生成和使用对象的 Bean 工厂,BeanFactory 类的实现过程包括Bean 对象的注册和获取,这里注册的是 Bean 对象的定义信息。

m0_69632475的博客 753

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

深入理解 spring IOC 实现简单的Bean容器案例

深入理解 spring IOC 实现简单的Bean容器案例演示

小凯的博客 879

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Spring创建bean的四种方式

spring创建bean的四种方式,spring的基本概念

W31003的博客 7900

一、【源码】实现一个简单的Bean容器

实现一个简单的Bean容器

Filwaod 449

Spring学习-01 Spring利用注解注册Bean到容器中

Spring学习-01 Spring利用注解注册Bean到容器中 01.01 依赖配置(pom.xml) <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>sp...

minqike的专栏 224

深入理解spring源码 Day01 ( 自己手写一个Bean容器吧!)

**} }在Bean工厂的实现中,包括了Bean的注册,这里注册的是Bean的定义信息。同时在这个类中还包括了获取Bean的操作。目前的BeanFactory仍然是非常简化的实现,但这种简化的实现内容也是整个Spring容器中关于Bean使用的最终体现结果,只不过实现过程只展示出基本的核心原理。在后续的补充实现中,这个会不断变得庞大。

天青色 等烟雨的博客 466

【spring01】Spring 管理 Bean-IOC,基于 XML 配置 bean

Spring 最大的价值,通过配置,给程序提供需要使用的web 层

qq_74232707的博客 2658

01、IoCContainer-1 容器、Bean

容器、Bean 介绍 IoC(IoCInversion of Control)也叫依赖注入DI(dependency injection) 对象可以通过构造函数参数、工厂方法参数,或者是对象自己被实例化后设置的属性来定义它们所依赖的其它对象。当所依赖的对象被实例化后,容器注入这些bean。bean自己控制依赖的实例化,或者是直接通过类的解析和Service Locator模式这...

风萧水寒的博客 307

实现一个简单的 Spring Bean 容器

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 6分钟。来自:网络,侵删面对复杂的源码,试着找到开头和结尾是一件非常具有挑战的事。为了让更多的初学者上手,从本文开始,我们将通过实践的方式带领读者逐步实现 Spring 框架的核心链路和功能逻辑。简化上手、凸显重点、摒弃冗余,让更多的初学者都能在这场学习旅途中收获满满。旅途即将开始,你准备好了吗?本文难度:★☆☆☆☆本文重点:...

良月柒 320

SpringIoC容器对bean的管理

Spring IOC容器管理bean的核心机制包括:1)三种创建方式(构造方法、工厂方法、静态工厂方法);2)作用域管理(单例/多例/请求/会话);3)生命周期管理(实例化-属性赋值-初始化-使用-销毁)。通过XML配置可指定作用域(scope属性)和生命周期回调方法(init-method/destroy-method)。

W18263823008的博客 862

Spring01_ioc之bean的创建和生命周期

1 首先,新建一个maven项目, 在pom.xml中导入spring相关 <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId&g

github_37217206的博客 207
上一篇: 代码随想录day4 -链表
下一篇: 代码随想录day5
Strongwind_
博客等级 码龄7年 139粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值