写在最前面,最近想学习spring,但是又不想只看看博客文档,这样只会知其然而不知其所以然,一些原理的东西即使当时知道了,但很快也会忘掉。所以我决定下载源码,通过写代码+debug,有利于我对spring工作本质有更深入的理解。我这人记忆力不太好,俗话好记性不如烂笔头,我决定记录下来供自己温故,也希望可以帮助一些遇到同样问题的人。
工具版本:spring5.1.5,gradle5.1,jdk1.8_131,IntelliJ IDEA 2018-3
文章前半部分是编译Spring5 源码遇到的问题总结,后半部分是使用编译的源码构建一个spring项目的小Demo
1. 编译器版本问题
下载源码导入idea后先build,等build完毕准备跑spring-core test发现右键list中怎么也找不到Run ‘all test’选项,经过一番周折才发现是导入的project竟然没有被idea 识别成module(如下图),那自然就没有Run ‘all test’选项了。
解决办法:因为我用的idea版本是IC (社区版),换成IU(企业版) 即可
2. 缺失jar包问题
解决办法:在spring-framework目录下执行 gradle objenesisRepackJar 和 gradle cglibRepackJar 命令即可在Spring-framework\spring-core\build\libs目录下生成jar包
剩下依次编译spring-core,spring-oxm,spring-context,spring-beans即可,期间会遇到一些case失败了,但我觉的应该不影响我们的使用。
注意:在编译spring-oxm时,也遇到丢失jar包问题。解决办法同#2一样。在spring-oxm目录下执行gradle genCastor 和 gradle genJaxb 生成castor和jaxb jar文件:
最后贴上我的编译结果:
前半部分结束!
后半部分就是如何基于已经编译的spring代码构建一个项目Demo
步骤:
1. 选中project右键 --> New--> Module
2. 在打开的框左侧栏中选中Gradle,再选中右边的Additional Libraries and Frameworks下的Java,最后next
3. 输入ArtifactId,选中next
4. 确认信息,选中finish
至此,可以看到project 下出现新建的Module
5. 编辑Module下的 build.gradle 引入对应的依赖 (Demo中只用到了Spring 注入,所以只需要引入spring-context依赖即可)
6. 在java目录下创建对用的包和类,目录结构如下:
代码如下:
package com.test.app;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.test")
public class Appconfig {
}
package com.test.dao;
import org.springframework.stereotype.Repository;
@Repository
public class TestDao {
public void query(){
System.out.println("Hello Spring!");
}
}
package com.test.main;
import com.test.app.Appconfig;
import com.test.dao.TestDao;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Appconfig.class);
TestDao testDao = annotationConfigApplicationContext.getBean(TestDao.class);
testDao.query();
}
}
7. 最后,执行 Main.java ,可从控制台执行结果:
至此,spring5.1项目编译以及构建项目已完成,希望对大家有所帮助,谢谢!