返回顶部
首页 > 资讯 > 精选 >怎么手撸一个Spring容器
  • 623
分享到

怎么手撸一个Spring容器

2023-06-29 10:06:15 623人浏览 独家记忆
摘要

这篇文章主要介绍了怎么手撸一个spring容器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么手撸一个Spring容器文章都会有所收获,下面我们一起来看看吧。从什么是ioc开始?Spring&mdas

这篇文章主要介绍了怎么手撸一个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);    }     * 注册单例bean     * @param beanName     * @param bean    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/324182.html(转载时请注明来源链接)

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

猜你喜欢
  • 怎么手撸一个Spring容器
    这篇文章主要介绍了怎么手撸一个Spring容器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么手撸一个Spring容器文章都会有所收获,下面我们一起来看看吧。从什么是IOC开始?Spring&mdas...
    99+
    2023-06-29
  • 五分钟手撸一个Spring容器(萌芽版)
    目录从什么是IOC开始?工厂和Spring容器订单:Bean定义获取订单:资源加载订单分配:Bean注册生产车间:对象工厂生产销售:测试大家好,我是老三,Spring是我们最常用的开...
    99+
    2024-04-02
  • 手撸一个Spring Boot Starter并上传到Maven中央仓库
    目录打包上传到中央仓库第一步 在issues.sonatype.org注册一个账号第二步 在issues.sonatype.org提交Issue第三步 配置Maven Setting...
    99+
    2024-04-02
  • 如何徒手撸了一个SpringBoot Starter
    这篇文章将为大家详细讲解有关如何徒手撸了一个Starter,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Spring Boot starter原理Sprin...
    99+
    2024-04-02
  • 手把手带你用React撸一个日程组件
    目录业务背景 使用技术技术难点设计思路 😱一脸懵逼苦 🙄开始构思 🌲目录结构 🛠拆分组件 代码实现 Container...
    99+
    2024-04-02
  • 手把手教你写一个spring IOC容器的方法
    本文分享自华为云社区《手把手教你写一个spring IOC容器》,原文作者:技术火炬手。 spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术...
    99+
    2024-04-02
  • 怎么用React撸一个日程组件
    本篇内容主要讲解“怎么用React撸一个日程组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用React撸一个日程组件”吧!目录结构└─Calendar   ...
    99+
    2023-06-05
  • 手把手带你实现一个萌芽版的Spring容器
    从什么是IOC开始? Spring——春天,Java编程世界的春天是由一位音乐家——Rod Johnson带来的。 Rod Johns...
    99+
    2024-04-02
  • 怎么手写一个Spring Boot Starter
    这篇文章将为大家详细讲解有关怎么手写一个Spring Boot Starter,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。何为 Starter ?想必大家都使用过 SpringBoot,在 Spring...
    99+
    2023-06-06
  • flutter 动手撸一个城市选择citypicker功能
    城市选择器在项目开发中一般都会用到,基于flutter版本的也有一个city_pickers但是已经很久没有人维护了,项目中之前也用的是这个,最近升级到flutter1.17.x后,...
    99+
    2024-04-02
  • Spring实现一个简单的SpringIOC容器
    接触Spring快半年了,前段时间刚用Spring4+S2H4做完了自己的毕设,但是很明显感觉对Spring尤其是IOC容器的实现原理理解的不到位,说白了,就是仅仅停留在会用的阶段,有一颗想读源码的心于是买了一本计文柯的《Spring技术内...
    99+
    2023-05-31
    spring ioc容器 sprin
  • 如何实现一个萌芽版的Spring容器
    这篇文章主要为大家展示了“如何实现一个萌芽版的Spring容器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现一个萌芽版的Spring容器”这篇文章吧。从什么是IOC开始?Spring--...
    99+
    2023-06-29
  • 何在tomcat容器中部署一个spring boot项目
    本篇文章给大家分享的是有关何在tomcat容器中部署一个spring boot项目,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。把spring-boot项目按照平常的web项目...
    99+
    2023-05-31
    springboot omc tomcat
  • C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架
      如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongodb.com/drivers/csharp/) ...
    99+
    2024-04-02
  • Spring容器BeanFactory怎么使用
    本篇内容主要讲解“Spring容器BeanFactory怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring容器BeanFactory怎么使用”吧!Spring容器什么是Sprin...
    99+
    2023-06-03
  • CSS中怎么创建一个网格容器
    本篇内容主要讲解“CSS中怎么创建一个网格容器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS中怎么创建一个网格容器”吧!   创建容器   与弹性布局...
    99+
    2024-04-02
  • 使用Portainer怎么部署一个Docker容器
    这期内容当中小编将会给大家带来有关使用Portainer怎么部署一个Docker容器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。操作步骤安装Portiner管理节点部署容器安装Portiner安装Por...
    99+
    2023-06-14
  • Spring容器刷新prepareRefresh第一步
    目录关键源码1.初始化状态位2.initPropertySources3.validateRequiredProperties4.处理早期事件关键源码 这次的内容是上图中的第1步...
    99+
    2023-03-19
    Spring容器刷新 Spring prepareRefresh
  • Spring容器刷新prepareRefresh第一步是什么
    本篇内容介绍了“Spring容器刷新prepareRefresh第一步是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下面是这部分的涉及...
    99+
    2023-07-05
  • docker容器中怎么创建一个MariaDB镜像
    docker容器中怎么创建一个MariaDB镜像,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。基于commit命令方式创建docker的安装[root@test01&nbs...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作