• 手写Spring1(实现Spring bean容器)



    前言

    之前虽然也手写过spring,不过是写的非常非常基础的版本

    这个系列主要是一个学习笔记,最近在看小博哥的渐进式手写Spring

    Spring也反反复复学过好几遍了,书籍、视频、源码对主脉络其实很熟悉了,但是对Spring的理解,总感觉差临门一脚,希望通过这次的学习能对Spring有个更加清晰的认识


    本章目标

    手写一个非常基础的Bean容器、可以用于定义、存放、获取bean,方便后续持续扩展


    一、设计

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

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

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


    二、实现

    1、工程结构

    ├─src
           ├─main
           │  ├─java
           │  │  └─cn
           │  │      └─ljc
           │  │          └─springframework
           │  │                  BeanDefinition.java
           │  │                  BeanFactory.java
           │  │
           │  └─resources
           └─test
               └─java
                   └─springframework
                       └─test
                           │  ApiTest.java
                           │
                           └─bean
                                   UserService.java
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2、Bean定义

    public class BeanDefinition {
    
        private Object bean;
    
    	// 定义Bean
        public BeanDefinition(Object bean) {
            this.bean = bean;
        }
    
    	// 获取bean
        public Object getBean() {
            return bean;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3、Bean 工厂

    public class BeanFactory {
    
        private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();
    
    	// 获取bean
        public Object getBean(String name) {
            return beanDefinitionMap.get(name).getBean();
        }
    
    	// 注册bean
        public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
            beanDefinitionMap.put(name, beanDefinition);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    三、测试

    1、事先准备测试类

    public class UserService {
    
        public void queryUserInfo(){
            System.out.println("查询用户信息");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3、测试结果

    查询用户信息
    
    • 1

    四、总结

    一个简单的Bean容器就完成了,已经初具雏形

    代码不多,但是重在理解他的思想、设计、方案

  • 相关阅读:
    硅基流动完成近亿元融资:加速生成式AI技术普惠进程
    英语2480常用词汇(持续更新)
    Java.lang.Class类 isLocalClass()方法有什么功能呢?
    深度相机(3D相机)
    【c#】log4net用法
    22.11.17打卡 mysql学习笔记
    旋转之后截取图像
    AppAnalytics设备的分析服务
    10.1 Shiro(简介)
    paddle学习赛——钢铁目标检测(yolov5、ppyoloe+,Faster-RCNN)
  • 原文地址:https://blog.csdn.net/qq_33522097/article/details/128075197