一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
一、前言
红豆生南国,春来发几枝。愿君多采撷,此物最相思。
讲道理,Map传参的弊端,应该不用我们多次重复了。但是有人就是不信这个邪,大清都忘了,还在用map传参?!简直丧心病狂,下面我举几个map传参的缺点:
- Map一时爽,维护爽歪歪。是,在接口需求快速迭代方面,map立下了大功,然后了,过了一段时间让你捡起来维护,你还记得传递的参数吗
- Swagger等API管理工具与你无缘了,因为根本识别不出来你的具体参数和类型
map传参爽,直接火葬场。
二、正文
今天,我们接着我们上次,将AbstractBeanFactory里面的抽象类进行实现。
-
首先我们创建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; } } -
我们定义一个BeanDefinition注册的接口,对外提供 Bean定义注册的方法
public interface BeanDefinitionRegistry { /** * 向注册表中注册 BeanDefinition * * @param beanName * @param beanDefinition */ void registryBeanDefinition(String beanName, BeanDefinition beanDefinition); } -
最后我们来实现本节最核心的一个实现类 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); } } -
现在我们基本上完成了,一个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
-
这就是第三天更文挑战的内容了,预知后事如何,且听下回分解。