哈喽大家好,最近闲来无事,又不想去研究业务逻辑,所以就开始尝试写一下简易spring框架的实现。由于刚工作一年且因为是在学习,所以如果有写的不对的地方,还希望各位大神给一点指导。本文的主要意图呢,就是为了我学习不会间断
先放出spring的官网供大家查阅
一、spring简介
这里我相信大家应该对spring都很了解了,就简单的一笔带过,不写那么多啰嗦的话题了。
核心就是一个控制反转(ioc)和面向切面编程(AOP)
主要功能呢就是:
1:方便解耦,简化开发;
2:方便的对程序进行拦截、运行、监控等功能;
3:可以对事务声明;
4:属于一个万能的框架,跟很多框架都是百搭;
由于本文只描述如何实现简易spring框架,所以不再阐述spring框架的搭建以及配置。
二、如何实现
一、准备工作
我们先创建一个基本上什么都没有的maven工程,大致如下
如果不会创建的小伙伴可以移步这位大佬的文档
建好我们的文件夹以及我们的容器类,还有测试类,这里先不用去管我的别的文件夹,只要去看我圈出来的类就可以了。这里是建了一个ZfApplicationContext去作为我们框架的容器类,以及Test测试类。
在spring框架中我们知道在创建容器类的时候要传递一个配置类作为参数,就是我们的AppConfig,
已经在调用getBean方法时传递的beanName作为参数,这里创建了一个空的业务层去模拟我们平时的业务层,这里的AppConfig类目前也是空的状态,里面并没有加内容。到这里我们的准备工作大致是完成了。
容器类中的代码,在提供一个构造方法
public class ZfApplicationContext {
//配置类
private Class configClass;
//创建容器时传入配置类
public ZfApplicationContext(Class configClass) {
this.configClass = configClass;
}
}
二、spring的启动和扫描逻辑的实现
我们知道在spring中实例化容器类的时候,传入的配置类可以通过@ComponentScan注解将我们要扫描的目录传递进去,这个是怎么实现的呢?
我们也来定义一个简单的@ComponentScan注解,这里我就不给它设置默认值了,我们后续可以手动去给它添加路径
@Retenti