手撸Spring学习笔记-3

169 阅读2分钟

6fdeffd3e4a84e577d9480f632ca32d5.jpeg

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

一、前言

红豆生南国,春来发几枝。愿君多采撷,此物最相思。

讲道理,Map传参的弊端,应该不用我们多次重复了。但是有人就是不信这个邪,大清都忘了,还在用map传参?!简直丧心病狂,下面我举几个map传参的缺点:

  • Map一时爽,维护爽歪歪。是,在接口需求快速迭代方面,map立下了大功,然后了,过了一段时间让你捡起来维护,你还记得传递的参数吗
  • Swagger等API管理工具与你无缘了,因为根本识别不出来你的具体参数和类型

map传参爽,直接火葬场。

二、正文

今天,我们接着我们上次,将AbstractBeanFactory里面的抽象类进行实现。

  1. 首先我们创建AbstractAutowireCapableBeanFactory类,进行Bean的实例化,具体步骤是:

    • 通过 BeanDefinition 获取 BeanClass 对象去创建 Bean 对象
    • 将获取到的实例化对象放入实例化对象容器中
    • 返回Bean对象
    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory {
    ​
        @Override
        protected Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException {
            Object bean = null;
            try {
                bean = beanDefinition.getBeanClass().newInstance();
            } catch (InstantiationException | IllegalAccessException e) {
                throw new BeansException("Instantiation of bean failed", e);
            }
    ​
            addSingleton(beanName, bean);
            return bean;
        }
    }
    
  2. 我们定义一个BeanDefinition注册的接口,对外提供 Bean定义注册的方法

    public interface BeanDefinitionRegistry {
    ​
        /**
         * 向注册表中注册 BeanDefinition
         *
         * @param beanName
         * @param beanDefinition
         */
        void registryBeanDefinition(String beanName, BeanDefinition beanDefinition);
    ​
    }
    
  3. 最后我们来实现本节最核心的一个实现类 DefaultListableBeanFactory ,DefaultListableBeanFactory 继承了 AbstractAutowireCapableBeanFactory 类,也就具备了接口 BeanFactory 和 AbstractBeanFactory 等一连串的功能实现。这个类实现了 BeanDefinition 对象 存放、注册以及获取。Bean的定义对象是存放在这个类所属的Map中的。

    public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry {
    ​
        private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();
    ​
        @Override
        protected BeanDefinition getBeanDefinition(String beanName) throws BeansException {
            BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);
    ​
            if (beanDefinition == null) throw new BeansException("No bean name is '" + beanName + "' is defined");
    ​
            return beanDefinition;
        }
    ​
        @Override
        public void registryBeanDefinition(String beanName, BeanDefinition beanDefinition) {
            beanDefinitionMap.put(beanName, beanDefinition);
        }
    }
    
  4. 现在我们基本上完成了,一个Bean完整的注册、获取的过程,我们接下来进行测试。

    • 首先我们先准备一个测试Bean

      public class UserService {
      ​
          public void queryUserInfo() {
              System.out.println("查询用户信息...");
          }
      }
      
    • 进行注册bean和获取bean的测试

      @Test
      public void test_BeanFactory(){
          // 1.初始化 BeanFactory
          DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
          // 2.注册 bean
          BeanDefinition beanDefinition = new BeanDefinition(UserService.class);
          beanFactory.registerBeanDefinition("userService", beanDefinition);
          // 3.获取 bean
          UserService userService = (UserService) beanFactory.getBean("userService");
          userService.queryUserInfo();
      }
      
    • 测试结果

      查询用户信息...
      ​
      Process finished with exit code 0
      

这就是第三天更文挑战的内容了,预知后事如何,且听下回分解。