Spring源码介绍和编译(一)

spring源码学习

具备
具备反射,设计模式,动态代理知识即可
学习心态: 1.不要专注细节。
2.看注释
3.见名知意
4.大胆猜测,小心验证
5.画图(时序图,结构图,总结图)
6.坚持
看源码意义:
1.提升自己阅读代码的功力(肚子有墨才能提升写作能力)
2.对框架更深层次的掌握(只有看过源码才能说精通)
3.spring是基础(从容应对各种关于框架方面的问题)
编译
准备工作
本示例基于 SpringV5.2.7RELEASE+GradleWapper+jdk1.8.0_131编译
环境准备
maven
jdk8+
idea
源码下载
进入https://github.com/spring-projects/spring-framework
Spring的源码是发布在github上面的
下载最新版发布版源码
不要太纠结版本区别,无需刻意保证跟老师一样的版本,只要5.x的正式发布(RELEASE)版本就行, 因为Spring中Ioc AOP核心分支是不会有变化的, 变的只有微小的细节。

稍微介绍版本代号

M:
M1,M2,…中的M是milestone的简写,意思是里程碑,代表着有重大改进的版本。(spring6版本要出来了,应该又是一个里程碑变化吧)

构建工具准备:
安装源码对应的gradle版本(也可不安装),建议使用gradleWraper中的gradle。
Gadle介绍:
Gradle是个构建系统,能够简化你的编译、打包、测试过程。熟悉Java的同学,可以把Gradle类比成Maven。
Gradle Wrapper的作用是简化Gradle本身的安装、部署。不同版本的项目可能需要不同版本的Gradle,手工部署的话比较麻烦,而且可能产生冲突,所以需要Gradle Wrapper帮你搞定这些事情。Gradle Wrapper是Gradle项目的一部分。
Gradle无需花时间去深入学习,因为我们在学习源码的过程不会过多涉及到gradle,当然有兴趣可以去学习, 相当于后起之秀,但是maven已经够优秀了,暂时应该也没有办法替代maven。
gradleWraper在该文件中有体现,相当于远程自动下载gradle到本地(所以你可以下载gradle,也可以不下,因为可以使用gradleWraper远程的统一版本):spring-framework-5.2.7.RELEASE\gradle\wrapper\gradle-wrapper.properties
所以如果你需要下载也最好下载该链接对应的gradle版本

修改build.gradle
这个文件就相当于我们Maven的pom.xml 管理项目的依赖等信息…
设置镜像
repositories {
maven{ url ‘https://maven.aliyun.com/nexus/content/groups/public/’}
maven{ url ‘https://maven.aliyun.com/nexus/content/repositories/jcenter’}
mavenCentral()
maven { url “https://repo.spring.io/libs-spring-framework-build” }
}

编译工作
按照官网的方式编译:
使用gradlew(gradle-wrapper命令) 先编译oxm:compileTest Java: Precompile spring-oxm with ./gradlew :spring-oxm:compileTestJava
编译compileTestJava模块
打开源码所在文件夹,在windows cmd命令中输入,在windows中当前目录无需输入“./”。
gradlew :spring-oxm:compileTestJava
配置了镜像很快(一两分钟)就能编译完成, 如果要很久说明你的镜像没起作用,如果编译异常请自行百度,每个人的电脑及环境产生的异常都有可能。

常见问题:
1.下载plugin出现401没有权限:

解决办法:
方案1(没有亲测). 把对应报错的plugin注释掉: 打开build.gradle—>plugins节点:

方案2(亲测有效):
将报错的插件去 阿里云仓库中按名字进行搜索, 如果1个都没搜到那还是采用方案1吧
如果搜到了开源看到是来自于gradle.plugin或jcenter仓库,并且版本只有0.0.4,没有0.0.2
那这里就要改2个地方:1修改plugin下载镜像 2.修改plugin对应的版本

将gradle.plugin或jcenter仓库的镜像地址加入到settings.gradle

加入到settings.gradle

修改plugin对应的版本:

2.出现:Language version 1.1 is no longer supported; please, use version 1.3 or greater.
出现这个问题, 应该是kotlin编译版本: 你的idea 版本太新,项目版本太老: idea版本和kotlin版本有关系。
解决方案:

  1. 降低idea版本, 可以使用2019
  2. 提升项目kotlin版本:

3.出现下载不到或找不到:com.google.code.sfindbugs:jsr305:3.0.2
解决方案:
看到域名就知道, 要翻墙!!。

导入项目到idea中
导入项目到idea中:Import into IntelliJ (File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle)
将项目导入到idea中提示配置gradle,按照如下配置

导入后等待编译,莫急,需要一点点时间,编译完成:

添加测试模块代码:
添加测试代码:Code away
new->model->gradle–>输入模块名称

编写代码测试ioc功能

添加依赖

dependencies {
testCompile group: ‘junit’, name: ‘junit’, version: ‘4.12’
compile(project(":spring-context"))
}

compile(project(":spring-context")) 代表本项目的
随意添加任意bean:
package cn.tulingxueyuan.beans;

import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl {

public void sayHi(){
    System.out.println("Hello Spring!");
}

}
添加启动配置类:
import cn.tulingxueyuan.beans.UserServiceImpl;
import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(“cn.tulingxueyuan”)
public class MainStat {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值