返回顶部
首页 > 资讯 > 精选 >实现Bean容器的示例分析
  • 768
分享到

实现Bean容器的示例分析

2023-06-15 11:06:09 768人浏览 八月长安
摘要

实现Bean容器的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Spring Bean 容器是什么?spring 包含并管理应用对象的配置和生命周期

实现Bean容器的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

一、Spring Bean 容器是什么?

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

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

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

而我们本章节的案例目标就是定义一个简单的 Spring 容器,用于定义、存放和获取 Bean 对象。

二、设计

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

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

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

实现Bean容器的示例分析

定义:BeanDefinition,可能这是你在查阅 Spring 源码时经常看到的一个类,例如它会包括  singleton、prototype、BeanClassName 等。但目前我们初步实现会更加简单的处理,只定义一个 Object 类型用于存放对象。

注册:这个过程就相当于我们把数据存放到 HashMap 中,只不过现在 HashMap 存放的是定义了的 Bean 的对象信息。

获取:最后就是获取对象,Bean 的名字就是key,Spring 容器初始化好 Bean 以后,就可以直接获取了。

接下来我们就按照这个设计,做一个简单的 Spring Bean 容器代码实现。编码的过程往往并不会有多复杂,但知晓设计过程却更加重要!

三、实现

1. 工程结构

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

工程源码:https://GitHub.com/small-spring/small-spring-step-01  (公众号:bugstack虫洞栈,回复:Spring 专栏,获取整套源码)

Spring Bean 容器类关系,如图 2-2

实现Bean容器的示例分析

图 2-2

  • 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  使用的最终体现结果,只不过实现过程只展示出基本的核心原理。在后续的补充实现中,这个会不断变得庞大。

四、测试

1. 事先准备

public class UserService {      public void queryUserInfo(){         System.out.println("查询用户信息");     }  }

这里简单定义了一个 UserService 对象,方便我们后续对 Spring 容器测试。

2. 测试用例

@Test public void test_BeanFactory(){     // 1.初始化 BeanFactory     BeanFactory beanFactory = new BeanFactory();          // 2.注册 bean     BeanDefinition beanDefinition = new BeanDefinition(new UserService());     beanFactory.registerBeanDefinition("userService", beanDefinition);          // 3.获取 bean     UserService userService = (UserService) beanFactory.getBean("userService");     userService.queryUserInfo(); }

在单测中主要包括初始化 Bean 工厂、注册 Bean、获取 Bean,三个步骤,使用效果上贴近与 Spring,但显得会更简化。

在 Bean 的注册中,这里是直接把 UserService 实例化后作为入参传递给 BeanDefinition  的,在后续的陆续实现中,我们会把这部分内容放入 Bean 工厂中实现。

3. 测试结果

查询用户信息  Process finished with exit code 0

通过测试结果可以看到,目前的 Spring Bean 容器案例,已经稍有雏形。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 实现Bean容器的示例分析

本文链接: https://lsjlt.com/news/280133.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 实现Bean容器的示例分析
    实现Bean容器的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Spring Bean 容器是什么Spring 包含并管理应用对象的配置和生命周期,...
    99+
    2023-06-15
  • JSP和BEAN的示例分析
    这篇文章主要介绍JSP和BEAN的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JSP是一种动态网页技术标准。JSP有很多值得学习的地方,这里我们主要介绍JSP和BEAN,包括介绍Servlet用来写busi...
    99+
    2023-06-17
  • EJB中bean的示例分析
    这篇文章将为大家详细讲解有关EJB中bean的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。EJB中最重要的部分:三个bean。开头:三个bean都要实现各自的接口,消息驱动除了要实现Messag...
    99+
    2023-06-03
  • Spring Bean中Bean的实例化分析
    这篇文章主要介绍了Spring Bean中Bean的实例化分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Bean中Bean的实例化分析文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-06-29
  • Linux容器的示例分析
    这篇文章将为大家详细讲解有关Linux容器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我告诉你一个秘密:使得我的应用程序进入到全世界的 DevOps 云计算之类的东西对我来说仍然有一点神秘。但...
    99+
    2023-06-16
  • Android沉浸式实现兼容的示例分析
    这篇文章主要介绍Android沉浸式实现兼容的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!先介绍下,什么是沉浸式状态栏?沉浸式,要求在应用中Android状态栏(StatusBar)与标题栏(ActionB...
    99+
    2023-05-30
    android
  • CSS容器查询的示例分析
    这篇文章给大家分享的是有关CSS容器查询的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在前端开发中经常需要按不同屏幕尺寸来进设计达到PC和移动端响应式。我们一般使用CSS媒体查询来检测视口宽度或高度,然...
    99+
    2023-06-15
  • Spring中IOC容器的示例分析
    这篇文章将为大家详细讲解有关Spring中IOC容器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.Spring的IOC容器概述Spring的IOC的过程也被称为依赖注入(DI),那么对象可以...
    99+
    2023-06-03
  • Spring中bean基础知识的示例分析
    这篇文章主要为大家展示了“Spring中bean基础知识的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring中bean基础知识的示例分析”这篇文章吧。Bean:在Spring技术...
    99+
    2023-05-30
    spring bean
  • 实现Ajax的示例分析
    小编给大家分享一下实现Ajax的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Ajax:  Asynchron...
    99+
    2024-04-02
  • C++ STL容器中红黑树部分模拟实现的示例分析
    这篇文章主要介绍了C++ STL容器中红黑树部分模拟实现的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、红黑树的概念红黑树(Red Black Tree...
    99+
    2023-06-21
  • Spring Bean作用域实例分析
    这篇文章主要介绍“Spring Bean作用域实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Bean作用域实例分析”文章能帮助大家解决问题。Bean作用域bean是存在作用域的...
    99+
    2023-07-02
  • CSS3浏览器兼容的示例分析
    这篇文章给大家分享的是有关CSS3浏览器兼容的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、浏览器兼容1.1、概要世界上没有任何一个浏览器是一样的,同样的代码在不一样...
    99+
    2024-04-02
  • Docker容器卷管理的示例分析
    小编给大家分享一下Docker容器卷管理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!容器卷管理容器卷 主机...
    99+
    2024-04-02
  • Java中并发容器的示例分析
    这篇文章给大家分享的是有关Java中并发容器的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、并发容器1.1 JDK 提供的并发容器总结JDK 提供的这些容器大部分在java.util.concurre...
    99+
    2023-06-15
  • Spring bean生命周期验证的示例分析
    这篇文章主要为大家展示了“Spring bean生命周期验证的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring bean生命周期验证的示例分析”这篇文章吧。一、从源码注释看be...
    99+
    2023-05-30
    spring bean
  • vue-lazyload实现的示例分析
    这篇文章给大家分享的是有关vue-lazyload实现的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先 ,在命令行输入npm install vue-lazyload...
    99+
    2024-04-02
  • C++实现LeetCode的示例分析
    这篇文章主要介绍C++实现LeetCode的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Reverse a linked list from position m to n. ...
    99+
    2023-06-20
  • javascript兼容性的示例分析
    这篇文章主要为大家展示了“javascript兼容性的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript兼容性的示例分析”这篇文章吧。1...
    99+
    2024-04-02
  • Spring IOC容器启动示例分析
    目录一、简介二、IOC整体流程一、简介 Spring核心有两个: IOC:控制反转AOP:面向切面编程 相信大家在项目中都使用过Spring进行开发,都知道Spring非常强大,那么...
    99+
    2023-02-14
    Spring IOC容器启动流程 Spring IOC容器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作