最近空闲时间就跟着大佬的博客学习spring手撸专栏系列,最开始有点怕,因为有尝试过看spring源码,但发现很难看进去(看不懂啊),也有尝试寻找视频但都没有找到我想要的,最后一直关注的博主出了这样一个专栏,设计模式,然后也会有对源码设计模式的实战讲解,发现还不错,然后因为论文就一直在学习设计模式就对设计模式了解了很多以后开始学习它的手敲源码专栏,第一章还好,等到第二章,第三章,错综复杂的类关系是着实绕蒙圈了,但是反复揣摩,手敲,复盘,竟感觉有一点点懂了,所以也想要把自己理解的Spring学习记录下来。
在这里分享一下心得把,Spring看不懂很多原因是不了解设计模式以及JAVA多态修饰符啊等基础知识,因为源码里边用了大量的设计模式,以及修饰符在继承实现以及各种设计原则下产生的效应,会发现了解以后会是另一个世界。了解不是炫技,是为了能写出更稳定的富有工匠精神的代码。
1.Bean容器介绍
首先,Spring最重要的就是bean,对bean的一个管理,那么我们要是实现也会在这个关注点下手,能够想到的我们要是使用bean就需要获取bean对象对吧,那么获取的功能要有,那么规范来说spring给我们提供bean的获取,那么Spring的对象从哪里来,Spring需要注册bean对象的功能把,那么bean从哪里来,就需要bean的定义功能把,那么以上就这个思路我们就把Spring的需求捋出来了。
1.Bean的定义:BeanDefinition:可能这是你在查阅 Spring 源码时经常看到的一个类,例如它会包括 singleton、prototype、BeanClassName 等。但目前我们初步实现会更加简单的处理,只定义一个 Object 类型用于存放对象。
2.Bean的注册:这个过程就相当于我们把数据存放到 HashMap 中,只不过现在 HashMap 存放的是定义了的 Bean 的对象信息。(PS:注册就是要把bean定义的对象存储起来,供获取使用)
3.Bean的获取:最后就是获取对象,Bean 的名字就是key,Spring 容器初始化好 Bean 以后,就可以直接获取了。
2.工程结构:
3.UML设计类图
哈哈,展示我的画的类图,好像比之前画的进步一些了
Spring Bean 容器的整个实现内容非常简单,也仅仅是包括了一个简单的 BeanFactory 和 BeanDefinition,这里的类名称是与 Spring 源码中一致,只不过现在的类实现会相对来说更简化一些,在后续的实现过程中再不断的添加内容。
- BeanDefinition,用于定义 Bean 实例化信息,现在的实现是以一个 Object 存放对象
- BeanFactory,代表了 Bean 对象的工厂,可以存放 Bean 定义到 Map 中以及获取
4.代码实现
1.Bean的定义
// 第一节,创建简单的bean容器
// 用于定义Bean实例化信息,现在的实现是以一个Object存放对象
public class BeanDefinition {
private Object bean;
public BeanDefinition(Object bean) {
this.bean = bean;
}
public Object getBean() {
return bean;
}
}
2.Bean工厂
// 代表了Bean对象的工厂,可以存放Bean定义到Map中以及获取
public class BeanFactory {
private Map<String, BeanDefinition> beanDefinationMap = new ConcurrentHashMap<String, BeanDefinition>();
// 获取bean
public Object getBean(String name) {
return beanDefinationMap.get(name).getBean();
}
// 注册bean
public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
beanDefinationMap.put(name, beanDefinition);
}
}
bean工厂中注册的是beanDefinition,获取的是bean的对象,这里bean工厂是Class,后续会更改,让每一个类只做一个功能并更加安全
5.测试
准备:
public class UserService {
public void queryUserInfo(){
System.out.println("查询用户信息");
}
}
class ApiTest {
@Test
public void test_BeanFactory(){
// 1.初始化 BeanFactory
BeanFactory beanFactory = new BeanFactory();
// 将new的对象通过构造方法传入BeanDefinition定义中
BeanDefinition beanDefinition = new BeanDefinition(new UserService());
// 2.注册bean(beanDefinition)
beanFactory.registerBeanDefinition("userService", beanDefinition);
// 3.获取bean
UserService userService = (UserService) beanFactory.getBean("userService");
userService.queryUserInfo();
}
}
登登登,一个简单的Spring Bean容器就实现完成了。