Spring源码阅读(一):获取源码

Spring源码阅读(一):获取源码

Spring是2003年开始兴起的一个框架,发展到今天已是非常的强大。对于工作2、3年的人在面试的时候,可能都会被问到是否看过开源框架的源码,以及谈谈你看过源码之后的心得或者见解之类的问题。今天这篇文章主要写给初学者,解决大家阅读源码的一些疑问和困难。

一、配置环境

因为Spring的源码采用的是gradle工具构建,所以需要先下载gradle工具。gradle是一个类似Maven的构建工具。如果对Maven或者Gradle都不熟悉,建议可以先了解一下gradle或者Maven。

1.1、Gradle的安装和配置

Gradle安装之前需要安装Jdk环境。我相信大家既然都学到Spring了,那肯定已经配置了JDK的环境。所以,在此至讲解Gradle的配置方式。

a、下载gradle:https://gradle.org/releases/

b、下载完毕之后,解压缩就行。

1.2、Gradle整合IDEA。

源码放到idea中查看会比较方便,所以接下来需要配置gradle整合idea。

1、打开idea的“settings”窗口,查找gradle配置,如下图:

018050414055

2、如上图红色箭头处,配置gradle的路径。之后点击“OK”按钮就行。

二、下载源码,并导入IDEA

2.1、下载源码

Spring源码在Github上。下载地址:https://github.com/spring-projects/spring-framework,如下图:

018050414240

点击绿色按钮,然后再点击“Download ZIP”按钮,等着下载完毕就行。

2.2、源码导入IDEA

源码下载好之后,就可以导入IDEA中了。步骤如下:

1、点击idea中的open project选项。

2、选择刚刚下载的spring源码目录(下载下来是zip压缩包,需要解压缩)。

3、等着初始化完毕。

导入完毕之后如图所示:

018050414315

之后,就可以阅读源码了。

三、更简单的源码获取方式

如果项目使用的Maven构建,想查看Spring的源码,直接再spring的方法上点击“ctrl+鼠标左键”就可以进入源码界面。开发时,我阅读源码的方式,更多是采用这种方式。因为这种方式简单直接。

四、其他

阅读源码,不是为了读源码而去读源码。因为源码读起来是比较枯燥难受的。我们应该带着问题去读源码,从而通过源码找到具体的答案。这样读源码会更有意思、也会更明白源码的表达。

package cn.javass.spring.chapter4; import java.io.File; import java.io.IOException; import junit.framework.Assert; import org.jboss.vfs.VFS; import org.jboss.vfs.VirtualFile; import org.jboss.vfs.spi.RealFileSystem; import org.junit.Test; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; @SuppressWarnings("all") public class ResourcePatternTest { @Test public void testClasspathPrefix() throws IOException { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //只加载一个绝对匹配Resource,且通过ResourceLoader.getResource进行加载 Resource[] resources = resolver.getResources("classpath:META-INF/INDEX.LIST"); Assert.assertEquals(1, resources.length); //只加载一个匹配的Resource,且通过ResourceLoader.getResource进行加载 resources = resolver.getResources("classpath:META-INF/*.LIST"); Assert.assertTrue(resources.length == 1); //只加载一个绝对匹配Resource,且通过ResourceLoader.getResource进行加载 resources = resolver.getResources("classpath:META-INF/MANIFEST.MF"); Assert.assertEquals(1, resources.length); } @Test public void testClasspathAsteriskPrefix() throws IOException { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //将加载多个绝对匹配的所有Resource //将首先通过ClassLoader.getResources("META-INF")加载非模式路径部分 //然后进行遍历模式匹配 Resource[] resources = resolver.getResources("classpath*:META-INF/INDEX.LIST"); Assert.assertTrue(resources.length > 1); //将加载多个模式匹配的Resource resources = resolver.getResources("classpath*:META-INF/*.LIST"); Assert.assertTrue(resources.length > 1); } @Test public void testClasspathAsteriskPrefixLimit() throws IOException { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //将首先通过ClassLoader.getResources("")加载目录, //将只返回文件系统的类路径不返回jar的跟路径 //然后进行遍历模式匹配 Resource[] resources = resolver.getResources("classpath*:asm-*.txt"); Assert.assertTrue(resources.length == 0); //将通过ClassLoader.getResources("asm-license.txt")加载 //asm-license.txt存在于com.springsource.net.sf.cglib-2.2.0.jar resources = resolver.getResources("classpath*:asm-license.txt"); Assert.assertTrue(resources.length > 0); //将只加载文件系统类路径匹配的Resource resources = resolver.getResources("classpath*:LICENS*"); Assert.assertTrue(resources.length == 1); } @Test public void testFilekPrefix() throws IOException { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource[] resources = resolver.getResources("file:D:/*.txt"); Assert.assertTrue(resources.length > 0); } @Test public void testVfsPrefix() throws IOException { //1.创建一个虚拟的文件目录 VirtualFile home = VFS.getChild("/home"); //2.将虚拟目录映射到物理的目录 VFS.mount(home, new RealFileSystem(new File("d:"))); //3.通过虚拟目录获取文件资源 VirtualFile testFile = home.getChild("test.txt"); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource[] resources = resolver.getResources("/home/test.txt"); Assert.assertTrue(resources.length > 0); System.out.println(resources[0].getClass()); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨景文Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值