想要深入的熟悉了解Spring源码,我觉得第一步就是要有一个能跑起来的极尽简单的框架,下面我就教大家搭建一个最简单的Spring框架,而且是基于Java Config形式的零配置Spring框架。

首先第一步创建一个空的maven web项目,这步很简单,自行百度。

在maven项目的pom.xml文件中添加Spring基础依赖:

        <properties><spring.version>4.3.7.RELEASE</spring.version><slf4j.version>1.7.21</slf4j.version><log4j.version>2.8.2</log4j.version><logging.version>1.2</logging.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-framework-bom</artifactId><version>${spring.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency><!-- log配置:Log4j2 + Slf4j --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-web --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId><version>${log4j.version}</version></dependency><dependency> <!-- 桥接:告诉Slf4j使用Log4j2 --><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>${log4j.version}</version></dependency><dependency> <!-- 桥接:告诉commons logging使用Log4j2 --><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-jcl</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency></dependencies>

我推荐搭建基于Java Config形式的Spring框架,不需要配置文件,全部使用Java代码形式来定义,简洁明了,对于想要深入了解Spring源码来说这点很重要,否则可能需要看非常多的Spring解析XML配置文件的解析类,对于任何人都不是很容易的功夫。而使用Java Config形式能直接看到配置类的运行流程,对了解Spring源码很有帮助。

要搭建基于Java Config形式的Spring框架,要求Servlet-api版本3.0以上,同时推荐Spring版本4.0以上,日志可以使用我另一篇博客上的log4j2的配置,自己修改下输出日志文件路径就可以了。

public class WebContextInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class<?>[] {RootContextConfig.class};}
}@Configuration
@ComponentScan
public class RootContextConfig {@Beanpublic Child child() {return new Child();}
}public class Child {
}@Component
public class Mother {
}

把这几个类都放在一个包下,然后启动tomcat,应该就可以启动Spring了,这就是一个最基本的Spring框架,而且包含了Java Config的Bean的定义以及组件扫描,RootContextConfig这个类就是容器的配置类,之后就可以开始跟着Spring框架的启动流程看了,DEBUG跟着一步一步的走。

WebContextInitializer 的父类的将RootContextConfig 当做配置类生成一个AnnotationConfigWebApplicationContext 类型ApplicationContext容器,注入到ContextLoaderListener中。

    ......protected WebApplicationContext createRootApplicationContext() {Class<?>[] configClasses = getRootConfigClasses();if (!ObjectUtils.isEmpty(configClasses)) {AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext();rootAppContext.register(configClasses);return rootAppContext;}else {return null;}}......protected void registerContextLoaderListener(ServletContext servletContext) {WebApplicationContext rootAppContext = createRootApplicationContext();if (rootAppContext != null) {ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);listener.setContextInitializers(getRootApplicationContextInitializers());servletContext.addListener(listener);}else {logger.debug("No ContextLoaderListener registered, as " +"createRootApplicationContext() did not return an application context");}}

不要对Tomcat内的源码花时间,主要是看Spring的源码,之后就可以看ContextLoaderListener的contextInitialized(…)方法了,Spring容器就是在这个方法里初始化生成的。如何初始化,这个太复杂了,需要花非常多的时间去看,去思考的,这里就不讲了,不过我可以说一些我自己总结的小技巧:

  1. 说是看源码,其实应该叫看和想。Spring源码很复杂,我觉得花在思考上的时间至少要和看的时间对等。看了,如果没有花时间想明白,等于白看。
  2. 理解重于记忆。Spring的流程很长,东西很多,如果单纯靠记忆肯定记不过来的,知道每个组件的大体作用以及作用的节点就够了,源码就在那里,又不会跑,记不清了翻翻就看到了,多翻几次就能够慢慢记住了,最开始看的时候不要执着于记忆。
  3. 多做笔记。Spring组件很多,在最开始看的时候,推荐做些笔记,将每个重要接口的作用及关键代码记录下,有时间就看看,最先了解的组件是你切入Spring源码的切口,借助他们能关联到其他的组件。
  4. 多百度。在看一些关键接口或者类时,如果其代码很复杂,先百度下吧,先对其功能有个了解,然后对照着功能看代码会有很大的帮助。
  5. 要多遍地看,反复地看。别想着看一遍就能看明白,在最开始的几次跟着初始化流程看源码时,不要执着于某个细节。先对Spring所有的组件功能有个大体了解,对初始化流程有个大体的了解,这是深入的基础。
  6. 多看日志,多DEBUG。多看日志能够提高你对Spring流程的了解程度,而且在排错时能有效提高效率;DEBUG是看源码最好的一种方式,是解疑的最直接途径,对于有些运行时难以触及的代码,需要你手动创造条件让流程走入此处。
  7. 多总结,多动手。不要仅局限于看和思考,要动手。源码看的仔细,基本能从源码上看出很多Spring组件的使用方式,总结各种组件的使用方法,然后自己定义相应的组件,将其引入Spring中,查看其作用流程,这是你拓展Spring的第一步,既能增强对Spring的理解,也能提高你对Spring的拓展能力。
  8. 不断完善框架。每熟悉一种组件的使用,就添加到自己的 框架中,不断完善自己的框架,到最后你的框架能够整合Spring大部分好用组件,也是你以后回顾Spring框架的最大助力。
  9. 多看注释,看方法的名称,参数和返回值。看注释,理解类,属性和方法的作用,着重第一段注释;看方法的名称,参数和返回值能对方法的作用有很明显的说明。

以上就是我自己看Spring总结的一些小技巧,希望对你们有些助益。如果在看Spring源码的过程中有些疑问,可以在回复里提,我会尽量帮助解答。

如何看Spring源码相关推荐

  1. 面试有没有看过spring源码_如何看Spring源码、Java每日六道面试分享,打卡第二天...

    原标题:如何看Spring源码.Java每日六道面试分享,打卡第二天 想要深入的熟悉了解Spring源码,我觉得第一步就是要有一个能跑起来的极尽简单的框架,下面我就教大家搭建一个最简单的Spring框 ...

  2. Spring源码分析(一):从哪里开始看spring源码(系列文章基于Spring5.0)

    一.概述 对于大多数第一次看spring源码的人来说,都会感觉不知从哪开始看起,因为spring项目源码由多个子项目组成,如spring-beans,spring-context,spring-cor ...

  3. 还觉得看spring源码脑壳痛?掌握这套方法,阿里大门向你敞开!

    目录 前言 Spring源码学习方法 1.通读Spring官方文档 2.如何正确阅读Spring源码 3.尽情去调试Spring吧 Spring核心技术知识 Spring大厂面试真题 金九银十全套面试 ...

  4. exe文件怎么看源码_Java 反射机制你还不会?那怎么看 Spring 源码?

    作者 | ewenll 责编 | 夕颜 出品 | CSDN博客 Java代码在计算机中经历的阶段:三个阶段Person.java经过javac编译,变为Person.class文件(字节码文件),字节 ...

  5. Java 反射机制你还不会?那怎么看 Spring 源码?

    作者 | ewenll 责编 | 夕颜 出品 | CSDN博客 Java代码在计算机中经历的阶段:三个阶段 Person.java经过javac编译,变为Person.class文件(字节码文件),字 ...

  6. 面试有没有看过spring源码_怎么阅读Spring源码?

    此问必是有心人,有心人必有心答. --题记 当我看到这个问题的时候,不禁心里一问,为何要阅读spring源码? 在我们的生活之中,有形形色色的万物(Object),有飞机,有汽车,有轮船,还有我这个沧 ...

  7. 【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  8. Spring源码系列:BeanFactory的创建

    2019独角兽企业重金招聘Python工程师标准>>> Spring的Ioc容器其实就是一个bean的关系网,依赖于core,bean,context三个组件来构建的.在spring ...

  9. beaninfo详解源码解析 java_【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  10. Spring源码分析:Bean加载流程概览及配置文件读取

    很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...

最新文章

  1. idea 执行java maven,IDEA的run maven方式启动步骤详解
  2. 解决android 编译失败 Unexpected scopes found in folder
  3. Python xml ElementTree 缩进(autoindent) 换行
  4. 【学习笔记】JS进阶语法一事件基础
  5. 监控cacti中的RRDtool用法详解
  6. 这本零差评且有趣的Python算法书有点火~
  7. UVA 1637 Double Patience
  8. 手机 物理分辨率 逻辑分辨率
  9. 利用Resource Hacker简单去除WinRar广告
  10. java混淆工具zelix比较_Java混淆器和java混淆编译
  11. 《 种子用户方法论》读书笔记
  12. 传奇3国际版 单机假设.说明和下载地址
  13. mysql cursor使用变量_mysql cursor游标的使用,实例
  14. 银行利率bp是什么意思,利率bp怎么换算
  15. Pivotal Gemfire gfsh shell的使用(2)
  16. POSA2 关于本书
  17. 创新实训1 小组分工以及项目部署
  18. Java JDK1.8帮助文档API下载
  19. 安装adobe阅读器时,报写至.....文件时错误
  20. AirCrack 爆破工具集合

热门文章

  1. 前端开发 - JQuery - 下
  2. 课堂练习——返回一个整数数组中最大子数组的和
  3. 关于wxwidgets图形界面的关闭窗口的按钮无效的解决办法
  4. python指数函数,幂函数
  5. AS3开发必须掌握的内容
  6. 如何对一个变量数据进行正则判定_数值数据与数值数据的分析
  7. opencv之透视变换cvWarpPerspective
  8. 哈夫曼树(二)之 C++详解
  9. 3D图形原理和一些基本概念
  10. 在CentOS6.7搭建Qt5.6.2环境