返回顶部
首页 > 资讯 > 精选 >如何实现一个萌芽版的Spring容器
  • 610
分享到

如何实现一个萌芽版的Spring容器

2023-06-29 09:06:17 610人浏览 安东尼
摘要

这篇文章主要为大家展示了“如何实现一个萌芽版的spring容器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现一个萌芽版的Spring容器”这篇文章吧。从什么是ioc开始?Spring--

这篇文章主要为大家展示了“如何实现一个萌芽版的spring容器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现一个萌芽版的Spring容器”这篇文章吧。

从什么是ioc开始?

Spring--春天,Java编程世界的春天是由一位音乐家--Rod Johnson带来的。

Rod Johnson先后编写了两本巨著《Expert One-on-One J2EE Design and Development》、《Expert One-on-One J2EE Development without EJB》,拉起了挑战正统Java EE框架EJB的大旗。

如何实现一个萌芽版的Spring容器

Rod Johnson不仅是一名旗手,更是开发了Spring这一轻量级框架,像一名勇敢的龙骑兵一样,对EJB发动了冲锋,并最终战胜了EJB,让Spring成为Java EE事实上的标准。

如何实现一个萌芽版的Spring容器

Spring的两大内核分别是ioC和aop,其中最最核心的是IOC。

所谓的IOC(控制反转):就是由容器来负责控制对象的生命周期和对象间的关系。以前是我们想要什么,就自己创建什么,现在是我们需要什么,容器就给我们送来什么。

如何实现一个萌芽版的Spring容器

也就是说,控制对象生命周期的不再是引用它的对象,而是容器。对具体对象,以前是它控制其它对象,现在所有对象都被容器控制,所以这就叫控制反转。

如何实现一个萌芽版的Spring容器

也许你还听到另外一个概念DI(依赖注入),它指的是容器在实例化对象的时候把它依赖的类注入给它,我们也可以认为,DI是IOC的补充和实现。

工厂和Spring容器

Spring是一个成熟的框架,为了满足扩展性、实现各种功能,所以它的实现如同枝节交错的大树一样,现在让我们把视线从Spring本身移开,来看看一个萌芽版的Spring容器怎么实现。

Spring的IOC本质就是一个大工厂,我们想想一个工厂是怎么运行的呢?

如何实现一个萌芽版的Spring容器

生产产品:一个工厂最核心的功能就是生产产品。在Spring里,不用Bean自己来实例化,而是交给Spring,应该怎么实现呢?——答案毫无疑问,反射

那么这个厂子的生产管理是怎么做的?你应该也知道——工厂模式。

库存产品:工厂一般都是有库房的,用来库存产品,毕竟生产的产品不能立马就拉走。Spring我们都知道是一个容器,这个容器里存的就是对象,不能每次来取对象,都得现场来反射创建对象,得把创建出的对象存起来。

订单处理:还有最重要的一点,工厂根据什么来提供产品呢?订单。这些订单可能五花八门,有线上签签的、有到工厂签的、还有工厂销售上门签的……最后经过处理,指导工厂的出货。

在Spring里,也有这样的订单,它就是我们bean的定义和依赖关系,可以是xml形式,也可以是我们最熟悉的注解形式。

那对应我们的萌芽版的Spring容器是什么样的呢?

如何实现一个萌芽版的Spring容器

订单:Bean定义

Bean可以通过一个配置文件定义,我们会把它解析成一个类型。

如何实现一个萌芽版的Spring容器

  • beans.properties

为了偷懒,这里直接用了最方便解析的properties,用一个<key,value>类型的配置来代表Bean的定义,其中key是beanName,value是class

userDao:cn.fighter3.bean.UserDao

  • BeanDefinition.java

bean定义类,配置文件中bean定义对应的实体

public class BeanDefinition {    private String beanName;    private Class beanClass;     //省略getter、setter   }

获取订单:资源加载

接下订单之后,就要由销售向生产部门交接,让生产部门知道商品的规格、数量之类。

资源加载器,就是来完成这个工作的,由它来完成配置文件中配置的加载。

public class ResourceLoader {    public static Map<String, BeanDefinition> getResource() {        Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>(16);        Properties properties = new Properties();        try {            InputStream inputStream = ResourceLoader.class.getResourceAsStream("/beans.properties");            properties.load(inputStream);            Iterator<String> it = properties.stringPropertyNames().iterator();            while (it.hasNext()) {                String key = it.next();                String className = properties.getProperty(key);                BeanDefinition beanDefinition = new BeanDefinition();                beanDefinition.setBeanName(key);                Class clazz = Class.forName(className);                beanDefinition.setBeanClass(clazz);                beanDefinitionMap.put(key, beanDefinition);            }            inputStream.close();        } catch (IOException | ClassNotFoundException e) {            e.printStackTrace();        }        return beanDefinitionMap;    }}

订单分配:Bean注册

对象注册器,这里用于单例bean的缓存,我们大幅简化,默认所有bean都是单例的。可以看到所谓单例注册,也很简单,不过是往HashMap里存对象。

public class BeanReGISter {    //单例Bean缓存    private Map<String, Object> singletonMap = new HashMap<>(32);        public Object getSingletonBean(String beanName) {        return singletonMap.get(beanName);    }        public void registerSingletonBean(String beanName, Object bean) {        if (singletonMap.containsKey(beanName)) {            return;        }        singletonMap.put(beanName, bean);    }}

生产车间:对象工厂

好了,到了我们最关键的生产部门了,在工厂里,生产产品的是车间,在IOC容器里,生产对象的是BeanFactory。

如何实现一个萌芽版的Spring容器

对象工厂,我们最核心的一个类,在它初始化的时候,创建了bean注册器,完成了资源的加载。

获取bean的时候,先从单例缓存中取,如果没有取到,就创建并注册一个bean

public class BeanFactory {    private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();    private BeanRegister beanRegister;    public BeanFactory() {        //创建bean注册器        beanRegister = new BeanRegister();        //加载资源        this.beanDefinitionMap = new ResourceLoader().getResource();    }        public Object getBean(String beanName) {        //从bean缓存中取        Object bean = beanRegister.getSingletonBean(beanName);        if (bean != null) {            return bean;        }        //根据bean定义,创建bean        return createBean(beanDefinitionMap.get(beanName));    }        private Object createBean(BeanDefinition beanDefinition) {        try {            Object bean = beanDefinition.getBeanClass().newInstance();            //缓存bean            beanRegister.registerSingletonBean(beanDefinition.getBeanName(), bean);            return bean;        } catch (InstantiationException | IllegalAccessException e) {            e.printStackTrace();        }        return null;    }}

生产销售:测试

UserDao.java

我们的Bean类,很简单

public class UserDao {    public void queryUserInfo(){        System.out.println("A Good man.");    }}

单元测试

public class apiTest {    @Test    public void test_BeanFactory() {        //1.创建bean工厂(同时完成了加载资源、创建注册单例bean注册器的操作)        BeanFactory beanFactory = new BeanFactory();        //2.第一次获取bean(通过反射创建bean,缓存bean)        UserDao userDao1 = (UserDao) beanFactory.getBean("userDao");        userDao1.queryUserInfo();        //3.第二次获取bean(从缓存中获取bean)        UserDao userDao2 = (UserDao) beanFactory.getBean("userDao");        userDao2.queryUserInfo();    }}

运行结果

A good man.
A good man.

至此,我们一个萌芽版的Spring容器就完成了。

以上是“如何实现一个萌芽版的Spring容器”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 如何实现一个萌芽版的Spring容器

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

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

猜你喜欢
  • 如何实现一个萌芽版的Spring容器
    这篇文章主要为大家展示了“如何实现一个萌芽版的Spring容器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现一个萌芽版的Spring容器”这篇文章吧。从什么是IOC开始?Spring--...
    99+
    2023-06-29
  • 手把手带你实现一个萌芽版的Spring容器
    从什么是IOC开始? Spring——春天,Java编程世界的春天是由一位音乐家——Rod Johnson带来的。 Rod Johns...
    99+
    2024-04-02
  • 五分钟手撸一个Spring容器(萌芽版)
    目录从什么是IOC开始?工厂和Spring容器订单:Bean定义获取订单:资源加载订单分配:Bean注册生产车间:对象工厂生产销售:测试大家好,我是老三,Spring是我们最常用的开...
    99+
    2024-04-02
  • Spring实现一个简单的SpringIOC容器
    接触Spring快半年了,前段时间刚用Spring4+S2H4做完了自己的毕设,但是很明显感觉对Spring尤其是IOC容器的实现原理理解的不到位,说白了,就是仅仅停留在会用的阶段,有一颗想读源码的心于是买了一本计文柯的《Spring技术内...
    99+
    2023-05-31
    spring ioc容器 sprin
  • 如何使用TypeScript实现一个IoC容器
    这篇文章主要介绍“如何使用TypeScript实现一个IoC容器”,在日常操作中,相信很多人在如何使用TypeScript实现一个IoC容器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用TypeScr...
    99+
    2023-06-16
  • spring容器启动如何实现初始化某个方法
    小编给大家分享一下spring容器启动如何实现初始化某个方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、前言很多时候,我们需要在项目启动的时候,就要完成某些...
    99+
    2023-06-20
  • 如何在Spring中实现一个BeanFactoryPostProcessor接口
    本篇文章为大家展示了如何在Spring中实现一个BeanFactoryPostProcessor接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。接口简介BeanFactoryPostProcess...
    99+
    2023-06-06
  • 如何实现一个angular版本的Message组件
    这篇文章主要介绍如何实现一个angular版本的Message组件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!学习一个框架或库的最好方法是看官方文档,并着手去写例子。最近在利用空闲...
    99+
    2024-04-02
  • PHP中的Spring容器如何实现数组和容器的依赖注入?
    在PHP中,依赖注入是一种常见的实现方式,常用于解决对象之间的依赖关系。Spring容器是一个非常强大的依赖注入框架,它提供了一种灵活的方式来注入对象之间的依赖关系。在本文中,我们将介绍如何在PHP中使用Spring容器实现数组和容器的依...
    99+
    2023-06-19
    spring 数组 容器
  • 如何实现一个读取xml文件内容的类
    这篇文章将为大家详细讲解有关如何实现一个读取xml文件内容的类,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一个读取xml文件内容的类 package project.util.xml;import ja...
    99+
    2023-06-03
  • 如何使用Python实现一个简易版Web服务器
    今天小编给大家分享一下如何使用Python实现一个简易版Web服务器的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、简介我...
    99+
    2023-07-05
  • 利用JSP 如何实现获取spring容器中的bean
    这篇文章给大家介绍利用JSP 如何实现获取spring容器中的bean,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JSP 获取spring容器中bean的方法总结方案1(Web中使用):ApplicationCont...
    99+
    2023-05-31
    jsp spring bean
  • 何在tomcat容器中部署一个spring boot项目
    本篇文章给大家分享的是有关何在tomcat容器中部署一个spring boot项目,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。把spring-boot项目按照平常的web项目...
    99+
    2023-05-31
    springboot omc tomcat
  • 如何利用springMVC容器实现一个源码加载功能
    如何利用springMVC容器实现一个源码加载功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。springmvc是一个基于servlet容器的轻量灵活的mvc框架,在它整个请...
    99+
    2023-05-31
    springmvc
  • 利用Spring Boot如何实现开发一个Web应用
    利用Spring Boot如何实现开发一个Web应用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。静态资源访问在我们开发Web应用的时候,需要引用大量的js、css、图片等静态...
    99+
    2023-05-31
    springboot web开=开放
  • Spring boot实现一个简单的ioc(1)
    前言跳过废话,直接看正文之前参与开发的几个spring的项目,用的版本都3.x, 最近忽然发现spring 5 都快上线了,于是赶紧去关注了下spring的最新动态。发现了spring-boot这个好东西(终于可以从各种错综复杂的xml配置...
    99+
    2023-05-31
    spring boot ioc
  • 如何使用PHP实现一个简单的博客2.0版本
    概述:在互联网时代,博客已经成为一种非常流行的表达方式和记录生活的工具。在开发一个博客应用程序时,PHP是一种常用的服务器端脚本语言,它可以用来处理用户请求、生成动态页面以及与数据库交互等。本文将介绍如何使用PHP来实现一个简单的博客2.0...
    99+
    2023-10-21
    博客 PHP 实现
  • 如何使用Spring Boot实现一个邮件发送功能
    本篇文章给大家分享的是有关如何使用Spring Boot实现一个邮件发送功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、引入依赖 <!-- mail依赖 -->...
    99+
    2023-05-31
    springboot spring boo
  • 如何在spring boot中使用spring-kafka实现一个接收消息功能
    本篇文章为大家展示了如何在spring boot中使用spring-kafka实现一个接收消息功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。实现方法pom.xml文件如下<&#63...
    99+
    2023-05-31
    springboot spring-kafka
  • 如何利用Spring容器实现高效的Java对象存储?
    Spring框架是一个非常流行的Java开发框架,它提供了很多功能强大的工具和库,让Java开发变得更加高效和简便。其中,Spring容器是Spring框架的核心组件之一,它可以帮助我们管理Java对象的生命周期,控制对象的创建和销毁,并提...
    99+
    2023-11-02
    存储 spring 容器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作