读完源码,手写一个spring框架(内含手写源码)

举报
Java实用技术@Pandas 发表于 2023/03/31 22:30:13 2023/03/31
【摘要】 最近详细阅读了spring的框架,从简单的配置到注解,从加载到运行,从返回简单string到返回视图,看的很慢。有不理解的地方就一次又一次debug流程,梳理运行过程和调用的方法。为了加深当前对spring的理解,也防止以后遗忘,又花了几天时间把写了一个迷你版的spring框架。迷你spring已经实现了注解和视图,支持tomcat运行和main方法直接调用。代码都上传到了github,请大家下载

最近详细阅读了spring的框架,从简单的配置到注解,从加载到运行,从返回简单string到返回视图,看的很慢。

有不理解的地方就一次又一次debug流程,梳理运行过程和调用的方法。

为了加深当前对spring的理解,也防止以后遗忘,又花了几天时间把写了一个迷你版的spring框架。

迷你spring已经实现了注解和视图,支持tomcat运行和main方法直接调用。

代码都上传到了github,请大家下载点星,感谢!!

github地址:GitHub - SeasonPanPan/myspring

先看以下spring源码中的类关系图:

我认为spring源码中最核心的类是AbstractApplicationContext,这个类中的refresh方法做的11大步骤,我已经在myspring中注释了。

	/**
	 * 在spring源码中,refresh方法做了以下事情:<br>
	 *
	 * 1、刷新上下文;
	 * 2、初始化BeanFactory,获取bean工厂,这里会解析XML文件;
	 * 3、对BeanFactory的各种功能进行填充,如注解;
	 * 4、激活各种BeanFactory处理器;
	 * 5、注册拦截Bean创建的Bean处理器;
	 * 6、初始化上下文中的资源文件;
	 * 7、初始化上下文事件广播器;
	 * 8、给子类扩展初始化其他Bean;
	 * 9、在所有bean中查找listener bean并注册;
	 * 10、实例化所有非惰性加载的bean;
	 * 11、结束:广播事件,这里面对url做了映射。 
	 * 
	 * 我们简化处理重要的步骤:解析XML,注册bean,实例化bean,保存URL映射关系
	 *
	 * @throws Exception
	 */
	@Override
	public void refresh() {
        ... //省略代码
    }

myspring代码中也尽量使用了源码的重要类名的定义,可以帮助理解源码。

主要的类涉及AbstractApplicationContext、BeanDefinition、DefaultListableBeanFactory、ContextLoaderListener、DispatcherServlet和ServletHandler等。

最后我写了测试类分别测试了在tomcat中启动,浏览器访问myspring项目情况,下图是启动图。

编辑

下图是在main方法中测试图

编辑

以上是我手写spring框架情况,欢迎大家指正。


微信公众号:Java实用技术手册
关注可了解更多java技能和互联网面试技巧。问题或建议,请公众号留言。
如果你觉得这篇文章对你有帮助,欢迎一键三连

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。