您当前的位置: 首页 >  容器

java持续实践

暂无认证

  • 6浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

手写spring- 创建简单bean容器

java持续实践 发布时间:2022-04-18 19:29:13 ,浏览量:6

文章目录
      • 目标
      • 设计
      • 简易实现

目标

springbean容器的目标是用于定义 存放 和获取bean

设计

使用map来存放bean . map的key为 bean的名称, value为 bean的定义信息

  • bean的定义: BeanDefinition . 用于获取这个bean的一些属性信息. 例如下图截取spring源码中, 部分的方法, 获取该bean是否是抽象的, 是否是单例的, 是否是原型的, 是否是懒加载的, 并且提供了一些set和get方法来设置bean 的属性和获取bean 的属性. 在此节中, 只实现getBean方法. 在这里插入图片描述
  • bean的注册, 把bean放入hashmap中, map的value为存放了bean的定义信息. 在spring的源码中, BeanFactory 并没有提供注册bean的方法.提供了获取bean的方法. 在这里插入图片描述 但在BeanFactory的子类DefaultListableBeanFactory中, 有注册bean的方法 在这里插入图片描述 在这里插入图片描述
  • bean的获取 : 在map中, 通过bean的名称, 获取bean的定义信息. 同样在DefaultListableBeanFactory类中, 可以看到获取BeanDefinition的方法. 在这里插入图片描述 Bean的注册信息也是用一个map存储 在这里插入图片描述
简易实现

uml图 在这里插入图片描述 BeanDefinition

public class BeanDefinition {

    private Object bean;

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

    public Object getBean() {
        return bean;
    }
}

BeanFactory

public class BeanFactory {

    private Map beanDefinitionMap = new ConcurrentHashMap();

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

    // 注册bean
    public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
        beanDefinitionMap.put(name, beanDefinition);
    }
}

模拟业务类

public class UserService {

    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 UserService());
        beanFactory.registerBeanDefinition("userService", beanDefinition);

        //3 . 获取bean
        UserService userService = (UserService) beanFactory.getBean("userService");
        userService.queryUserInfo();
    }
}

运行结果如下 在这里插入图片描述

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0825s