# [一] Spring 源码学习简介

内容概述

Spring源码系列是对Jack老师上课内容的笔记整理,其中包括上课笔记以及对视频内容的流程整理,对照视频跟进代码添加注释,过程虽然繁琐,但是一定会有收获,感谢期间遇到问题Jack老师耐心的解答。

  • 在此引用Jack老师的话:没毛病吧,老铁,开始写笔记了。

知识点

  • Jack老师在视频里重点强调的部分会以知识点的方式总结出来。
  • Spring相关流程图和扩展内容会以 附: XXX文件单独整理。

Jack老师博客传送门

# [1] 为什么要学Spring 源码

  • 提升自己的写代码能力
  • 从全局考虑如何使代码变得灵活和可扩展

# [2] 如何学习Spring 源码

  • spring重新定义了JAVA
  • spring源码是有一定难度的
  • 如果想成为真正的高手,spring源码必须要攻克,不是危言耸听的
  • 在学习期间,不管有多忙,课后一定要按照老师的讲解思路去理解课堂上讲解的内容
  • 遇到不理解的一定要问,要反复去琢磨
  • spring源码这块,进大厂是必问的环节

# [3] Spring的历史

  • 2002年10月,Rod Johnson发布《Expert One-on-One J2EE设计和开发》一书
  • 2004年03月,Spring1.0发布
  • 2006年10月,Spring2.0发布
  • 2009年12月,Spring3.0发布
  • 2013年12月,Spring4.0发布
  • 2017年09月,Spring5.0发布

# [4] 准备工作

  • JDK1.8版本
  • spring 5.1.3.RELEASE最新版本
  • 补一下Lambda表达式的知识
  • Spring源码下载
git clone --branch v5.1.3.RELEASE https://gitee.com/Z201/spring-framework.git
  • 安装配置gradle,gradle需要支持JDK8的版本
  • 到下载的spring源码路径执行gradle命令
gradlew :spring-oxm:compileTestJava
  • 用idea打开spring源码工程,在idea中安装插件kotlin,重启Idea
  • 把编译好的源码导入到工程中

# [5] 搭建Spring 项目

导入jar依赖,Spring中最核心的4个jar:

  • spring-beans
  • spring-core
  • spring-context
  • spring-expression

一个最最简单的spring工程,理论上就只需要一个jar就够了

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>${spring.version}</version>
</dependency>

# [6] 开启 Spring 日志

一个空的spring工程是不能打印日志的,要导入spring依赖的日志jar

<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>LATEST</version>
</dependency>

# [7] Spring中XSD引入

Spring中要引入自定义标签,必须要引入其对应的XSD文件。如:<context:component-scan base-package="com.xx.jack"/>标签,必须要引入:

xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd

在标签对应的jar包下面找到对应的Spring.schemas,在这个文件中就会有对应的XSD路径和命名空间。

# [8] Spring容器加载方式

  • 类路径获取配置文件

    • ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
  • 文件系统路径获取配置文件【绝对路径】

    • ApplicationContext applicationContext = new FileSystemXmlApplicationContext("E:\idea\public\springdemo\src\main\resources\spring.xml");
  • 无配置文件加载容器

    • ApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.xx.jack");
  • Springboot加载容器

    • ApplicationContext applicationContext = new EmbeddedWebApplicationContext();