文章目录

  • 概述
  • 思路与设计
  • 简述大体思路
  • bean定义类
  • 容器类
  • spring架构图
  • 类图
  • 编码
  • 测试代码
  • 参考文章


概述

众所周知spring的作用,即对bean对象进行管理,保证开发人员无需花费大量精力去管理业务开发过程中各种对象的创建与管理。所以笔者就以手写spring源码的方式通过不断的迭代完成自研框架的编写以及项目驱动的方式去理解掌握spring核心思想与设计。

思路与设计

简述大体思路

我们都知道spring能够完成bean对象的管理,都是在容器中进行操作,以及所有的bean的信息都会存储在一个bean定义的对象中。
所以,在我们编写自研框架的第一步,就是设计一个bean定义类和一个bean定义管理类。

bean定义类

通过阅读spring源码,我们知道每一个bean的信息都会存在一个bean定义类,我们称这个类为BeanDefinition,通过bean定义信息类,我们就会知道某个类的各种信息,如果我们把每一个bean比作饼干的话,我们就可以把每个BeanDefinition比作饼干的制作成分表。

容器类

容器也是spring中的一个重要的概念,对于每种数据结构,我们都可以认为它们都是一种容器,只不过操作的方式有区别而已。我们预想bean容器需要喊出某个bean名字就能够快速找到某个bean定义的信息从而创建bean,对此,我们选用map作为spring容器的数据结构。

spring架构图

spring 自定义抽象类_spring

类图

spring 自定义抽象类_spring_02

编码

bean定义代码如下所示,由于改版只是搭建大体思路,所以这里bea定义对象存储bean信息的方式是直接存储实例化的bean,后续会不断迭代尽可能接近spring源码。

package cn.shark.springframework;

/**
 * bean定义
 *
 * @author Zsy
 * @date 2021-08-30 21:33
 */
public class BeanDefinition {

    private Object bean;

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

    public Object getBean() {
        return this.bean;
    }
}

该容器类依赖与bean定义类,我们可以看到容器存储bean定义的方式是将bean定义的名字和bean定义对象存入map中的方式进行,当需要拿到某个bean时,我们就通过bean定义的名字取得某个bean定义,在通过该bean定义取得某个bean。
这也是java面向对象思想的重要体现,单一职责原则,容器对象负责操作容器内的元素,想去bean就通过bean定义得到信息在进行创建并获得。

package cn.shark.springframework;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * bean工厂
 *
 * @author Zsy
 * @date 2021-08-30 21:34
 */
public class BeanFactory {

    private Map<String, BeanDefinition> beanDefinitionMap  = new ConcurrentHashMap<String, BeanDefinition>();

    public void registerBeanDefinition(String beanNamem, BeanDefinition beanDefinition) {
        beanDefinitionMap.put(beanNamem, beanDefinition);
    }

    public Object getBean(String name) {
        return beanDefinitionMap.get(name).getBean();
    }
}

测试代码

package cn.shark.springframework.test;

import cn.shark.springframework.BeanDefinition;
import cn.shark.springframework.BeanFactory;
import cn.shark.springframework.bean.UserService;
import org.junit.Test;

/**
 * @author Zsy
 * @date 2021-08-30 21:42
 */
public class ApiTest {

    @Test
    public void test_BeanFactory(){
        BeanFactory beanFactory=new BeanFactory();

        BeanDefinition beanDefinition=new BeanDefinition(new UserService());
        beanFactory.registerBeanDefinition("userservice",beanDefinition);

        UserService userservice = (UserService)beanFactory.getBean("userservice");
        userservice.queryUserInfo();
    }
}