《手撸Spring》-实现一个简单的Bean容器

本文详细介绍了如何从设计到实现Spring Bean容器,包括BeanDefinition的定义、BeanFactory的构造与Bean的注册和获取。通过测试UserService实例,展示了容器的工作流程。
摘要由CSDN通过智能技术生成

一、Spring Bean 容器是什么

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

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

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

二、设计

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

一个简单的Bean容器实现,还需Bean的定义、注册、获取基本三个步骤:

  • 定义:BeanDefinition,这个类在查阅源码中是经常看到的,但目前我们初步实现会非常简单的处理,制定义一个Obejct类型用于存放对象。
  • 注册:这个过程相当于我们把数据存放到HashMap中,只不过现在HashMap存放的是定义了Bean的对象信息。
  • 获取:Bean的名字就是key,容器初始好Bean以后,就可以直接获取了。

三、实现

1、工程结构

在这里插入图片描述

2、Bean定义

public class BeanDefinition {

    private Object bean;

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

    public Object getBean() {
        return bean;
    }
}
  • 目前的Bean定义中,只有一个Object用于存放Bean对象。
  • 在后面陆续的实现中会逐步完善BeanDefinition相关属性的填充。

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的操作。

四、测试

1、事先准备

public class UserService {

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

}
  • 这里简单定义一个UserService对象,方便下面的容器测试。

2、测试用例

public class BeanDefinitionTest {

    @Test
    public void test() {
        //初始化BeanFactory
        BeanFactory beanFactory = new BeanFactory();

        //注册bean
        BeanDefinition beanDefinition = new BeanDefinition(new UserService());
        beanFactory.registerBeanDefinition("userService", beanDefinition);

        //获取bean
        UserService userSerivce = (UserService) beanFactory.getBean("userService");
        userSerivce.queryUserInfo();
    }
}
  • 在单侧中主要包括初始化Bean工厂、注册Bean、获取Bean这三个步骤。
  • 在Bean的注册中,这里是直接把UserService实例化后作为入参传递给BeanDefinition的,在后面的实现中,会将这部分内容放入Bean工厂中实现。

3、测试结果

在这里插入图片描述

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

参考:《手写spring:渐进式源码实践》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值