小小Spring(一)

327 阅读2分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

一、前言

看了小傅哥的《Spring手撸专栏》,觉得写的很好很用心,但我想,按照我的理解,重新写一边,在他的基础上,让我这种菜鸡,更容易看懂。

什么是Spring,以我目前的理解, 我就当他是个帮我们托管和放置对象的容器,就这么简单我就这么理解,剩下的厉害之处以后再说吧。 大家可以去看看他的博客:bugstack.cn/ ,里面有很多值得学习的东西。

二、设计

image.png

  • 定义:BeanDefinition,可能这是你在查阅 Spring 源码时经常看到的一个类,例如它会包括 singleton、prototype、BeanClassName 等。但目前我们初步实现会更加简单的处理,只定义一个 Object 类型用于存放对象。
  • 注册:这个过程就相当于我们把数据存放到 HashMap 中,只不过现在 HashMap 存放的是定义了的 Bean 的对象信息。
  • 获取:最后就是获取对象,Bean 的名字就是key,Spring 容器初始化好 Bean 以后,就可以直接获取了。 在Spring中,我们就直接把BeanDefinition,定义在一个HashMap里。

image.png

  1. BeanDefinition,用于定义 Bean 实例化信息,现在的实现是以一个 Object 存放对象
  2. BeanFactory,代表了 Bean 对象的工厂,可以存放 Bean 定义到 Map 中以及获取。

三、编码

1.最基本的Bean定义,这里的BeanDefinition,只是Bean的信息,描述Bean用的,不是我们真正用到的Bean,我们后面会让BeanDefinition变得丰富起来

public class BeanDefinition {

    private Object bean;

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

    public Object getBean() {
        return bean;
    }

}

2.在 Bean 工厂的实现中,包括了 Bean 的注册,这里注册的是 Bean 的定义信息。同时在这个类中还包括了获取 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);
    }

}

四、测试

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

public class UserService {

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

}

2.初始化 Bean 工厂、注册 Bean、获取 Bean。

@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();
}

结果

查询用户信息