引言
你工作这么多年,能用简单的一段话说清楚什么是Spring吗?
你可能想了想,回复了非常专业的话语:
Spring是一个开源的Java开发框架,它是为了解决企业级应用开发的复杂性而创建的。Spring框架的核心思想是通过把复杂的事情交给专门的工具去做,从而降低开发的难度。
它是基于Java的反射机制,通过反射机制,Spring框架可以将配置文件中的信息加载到内存中,并通过反射机制动态的创建对象,并将对象注入到容器中。
Spring框架的主要功能有:
IOC容器:Spring框架的核心,负责管理Bean的生命周期,并负责依赖注入。
AOP:Spring框架的另一个核心,通过AOP可以对业务逻辑进行隔离,从而降低业务逻辑的耦合性。
那我们这次【一次学Spring】专栏就是通过手写Spring的方式,让我们对Spring再次复习。在此之前,你可能只是背了八股文,或者在工作中,因为遇到了问题,通过Debug的方式熟悉了代码。但这样的方式,都是比较不成体系的学习,那这一次,我们就从0到1带你整体学习下Spring。
希望热爱学习的你,想深入学习的你,关注我。如果觉得通过此次学习,确实有不一样的收获,可以对此篇文章进行点赞,收藏。
目标
本小节,使用5分钟实现一个简单的Bean容器,并增加单元测试的方式验证我们的结果
准备
IDE:idea
JDK: 1.8
Maven: 3.9.5
实践
先看效果
使用tree命令查看项目目录及文件
因为我是Windows系统,使用命令如下:
tree /f
目录结构如下
│ pom.xml
│
└─src
├─main
│ └─java
│ └─cn
│ └─itdebug
│ └─spring
│ └─beans
│ │ BeansException.java
│ │
│ └─factory
│ BeanFactory.java
│
└─test
└─java
└─cn
└─itdebug
└─spring
└─beans
└─factory
│ BeanFactoryTest.java
│
└─model
User.java
代码实现
我们可以看到在本小节中,
一、我们在源码src目录下定义了2个类,分别是:
1、BeanFactory
源代码如下:
public class BeanFactory {
private final Map<String, Object> signletonObjects = new HashMap<>();
Object getBean(String name) throws BeansException {
return signletonObjects.get(name);
}
public void registerSingleton(String name, Object bean) {
signletonObjects.put(name, bean);
}
}
BeanFactory顾名思义就是一个工厂,用来生产Bean。
Spring的IOC容器是通过BeanFactory来实现的,BeanFactory是Spring框架的核心接口,它负责生产Bean,管理Bean的生命周期,以及对Bean进行依赖注入。
在Spring源码中,它是一个接口(Interface)。在本小结中,为了更方便的演示,我们定义成了类(Class)。并且在该类中,我们定义了一个Bean容器,即HashMap。看到这里是不是恍然大悟,原来Bean容器就是一个HashMap啊。其实在Spring源码中就是这么实现的
2、BeansExcepetion
public class BeansException extends RuntimeException {
private static final long serialVersionUID = 1L;
public BeansException() {
super();
}
public BeansException(String message) {
super(message);
}
}
单元测试验证
代码如下:
public class BeanFactoryTest extends TestCase {
public void testBeanFactory() {
/*
* 模拟Spring容器初始化
*/
BeanFactory beanFactory = new BeanFactory();
User bean = new User("Eric", "上海市");
beanFactory.registerSingleton("user", bean);
Assert.assertEquals("Eric", ((User)beanFactory.getBean("user")).getName());
}
}
代码中,我们是通过new关键字的方式来简单的演示我们的容器初始化,同时new User对象将对象注册到我们的容器中,并且通过单元测试的方式进行验证
验证结果
通过
代码源码见
流程图:
最后
内容分享需要坚持,如果你看到最后,对内容也觉得不错的话,给我点点👍,加关注。
本节分享就到这,下一节,我将继续基于本节内容进行进一步优化,按照Spring的方式去定义我们的Bean信息。