今天开始我要手写一个Spring,就是这么膨胀。小小Spring,拿下!注意是小小Spring哈,不是Spring本体,毕竟本体连看懂都难,就别说能充分理解然后手写出来。
本次手写Spring全程参考 第01章:开篇介绍,我要带你撸 Spring 啦! | 小傅哥 bugstack 虫洞栈
你要说我能不能不抄别人,那指定是不能的,虽然很想自己从现有的 Spring 中把核心部分抽离出来,毕竟自己动比较爽。总之千言万语汇成一句话:实力不允许啊。
不过呢?我会在学习的过程中,将自己的思考全盘记录下来,相信你不管是菜鸡还是大神都能受用。因为本菜鸡写出来的东西,一般菜鸡还是能看懂的。如果看不懂就证明你比我更加菜,哈哈哈哈。
废话不多说,直接开搞。标题写的啥来着?不是我跑题,我是试你来着。搞一个超级简单的Spring容器,整高端点应该叫 BeanFactory
,Factory
这个单词我认识–工厂,那 Bean
是啥?我翻译了一下,他说是豆子。这么一推理,BeanFactor
那指定是生产豆子的豆子工厂,一点毛病没有。
那 BeanFactory
的设计就出来了
public class BeanFactory {
Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();
// 要什么豆子先来这里登记
public void register(String name, BeanDefinition beanDefinition) {
beanDefinitionMap.put(name, beanDefinition);
}
// 拿豆子
public BeanDefinition getBean(String name) {
return beanDefinitionMap.get(name);
}
}
BeanDefinition
就是豆子的特征值,比如你买豆子的时候就会跟老板说,要一个绿豆,饱满一点的,再不济你那一个给他看,然后说来一个和这个一样的豆子。
public class BeanDefinition {
private final Object bean;
public BeanDefinition(Object bean) {
this.bean = bean;
}
public Object getBean(){
return this.bean;
}
}
那领豆子的流程是怎么样的?
public class BeanFactoryTest {
@Test
public void test() {
// 1.我先把工厂搞起来
BeanFactory beanFactory = new BeanFactory();
// 2.你准备好要什么豆子
Bean bean = new Bean();
BeanDefinition beanDefinition = new BeanDefinition(bean);
// 3.登记豆子信息
beanFactory.register("beanName", beanDefinition);
// 4.取豆子
BeanDefinition bd = beanFactory.getBean("beanName");
// 5.用豆子
Bean b = (Bean) bd.getBean();
b.test();
}
}
public class Bean {
public Bean() {
}
public void test() {
System.out.println("我是一颗绿豆子");
}
}
我发现你小子来过我工厂之后,怎么其他人都不来了?原来是你小子来过我工厂之后,回去和大家说你拿来做登记的样品被我收了,然后取豆子的时候就是这个样品。
既然自己都有豆子了还去工厂干嘛?还耽误时间跑去工厂,这工厂迟早倒闭。确实我家工厂还没布置生产线,只能大家先带过来。下次我布置好生产线就不用带样品了。
而且你小子不识货啊,我家工厂有特殊技术,如果有其他人想要和你样品一样的豆子,都可以来取。我从吗喽那里求来一种仙术,名叫指针。
如果其他人也来工厂拿你拿过的豆子,我可以拿一个豆子指针给她,这个豆子指针和原来的豆子一模一样,没有区别。你们可以有一个一模一样的豆子,你把豆子切了两半,她也看到豆子变成两半了。就是这么神奇,真的不要试试吗?
虽然现在的工厂用起来还有点…呃简陋,不过相信我,生产线马上就好了。
能不能用另说,你就说是不是最简单的吧?我工厂连生产都不用,简单这个事情是不是拿捏得死死的?
总之不管三七二十一,我们先给他实现了。实践是检验真理的唯一标准,先做起来其他的慢慢就懂了。