1.实现简单的Spring容器

48 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

1.1 容器的理解

Bean对象 交给Spring Bean 容器管理,这个Bean 对象就会被拆解,存储到 Spring Bean 容器的定义中,便于管理和解耦。

当对象被定义和存储后,会由Spring Bean 容器统一进行分配,包括 Bean对象的初始化和属性填充。

1.2 简单容器设计

存储数据的数据结构称为容器,在Spring 中,需要存储对象名称和对象的数据结构,所以HashMap 最合适。

BeanDefinition :保存对象的 singleton属性,property type 属性等等。

代码实现

public class BeanDefinition {
    /**
     * @Author: Take-off
     * @Description: //TODO 所有对象的父类
     * @Date: 5:16 PM 2022/12/9
     **/
    private Object bean;
​
    public BeanDefinition(Object bean) {
        this.bean = bean;
    }
​
    public Object getBean() {
        return bean;
    }
}

BeanFactory:Bean对象工厂,可以将Bean对象的定义存储到Map中。用于生成和使用对象

public class BeanFactory {
    //ConcurrentHashMap 就是线程安全 的 HashMap
    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对象

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

测试类

public class ApiTest {
    @Test
    public void test_BeanFactory(){
        // 1.初始化 BeanFactory
        BeanFactory beanFactory = new BeanFactory();
​
        // 2.注入bean
        BeanDefinition beanDefinition = new BeanDefinition(new User());
        beanFactory.registerBeanDefinition("user", beanDefinition);
​
        // 3.获取bean
        User userService = (User) beanFactory.getBean("user");
        userService.queryUserInfo();
    }
}