highlight: arduino-light
之前由于换电脑,所以把原来编译好的源码上传到了百度网盘里,本以为下载下来就能用,结果并不是。 怎么办呢,只能重新再编译一遍。
本来是打算和写spring源码专栏的初衷放到一起的,想想还是单独在写一篇,如果后续还需要编译自己也能做个参考。
话不多说,直接开干。
下载spring5.1.x源码
下载源码spring5.1.x包并解压。
下载地址:https://github.com/spring-projects/spring-framework/tree/5.1.x
解压zip
注意:解压以后有2层spring-framework-5.1.x目录,导入idea用最里面的spring-framework-5.1.x目录。
安装gradle-5.6.3版本
官网下载链接地址:https://gradle.org/releases/
下载完成解压
新建系统环境变量GRADLE_HOME
编辑系统环境变量PATH
新建系统环境变量GRADLE_USER_HOME
配置gradle的仓库地址,此处配置的是默认的仓库地址,用户目录下的.gradle
校验gradle 是否安装成功: gradle -v
插一句,jdk用的是1.8.0_181
修改拉取jar包的镜像,换成阿里云。新建文件init.gradle
init.gradle
内容如下
```gradle allprojects{ repositories { def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/' all { ArtifactRepository repo -> if(repo instanceof MavenArtifactRepository){ def url = repo.url.toString() if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) { remove repo } } }
maven {
url 'file:///C:/Users/claude.peng/.gradle'
}
maven {
url REPOSITORY_URL
}
} } ```
配置Daemon=true,加速gradle的构建。新建文件gradle.properties`
org.gradle.daemon=true
至此gradle安装配置完成。
导入spring5.1.x到idea
首先关闭所有打开的项目。
选择Import Project
选择我们下载的源码的目录:E:\study\spring-framework-5.1.x\spring-framework-5.1.x
导入会自动下载依赖然后提示报错。
配置idea中的gradle。
注意jdk也要配置一下。
在build.gradle中增加repositories部分的配置,一共有2处。
buildscript {
repositories {
gradlePluginPortal()
mavenLocal()
maven { url "https://repo.spring.io/plugins-release" }
maven { url "https://maven.aliyun.com/repository/spring" }
maven { url "https://maven.aliyun.com/repository/public" }
}
dependencies {
classpath("io.spring.gradle:propdeps-plugin:0.0.9.RELEASE")
classpath("org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16")
}
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
maven { url "https://maven.aliyun.com/repository/spring" }
maven { url "https://maven.aliyun.com/repository/public" }
}
修改完毕,重新刷新导入。
依赖下载完成
首先编译spring-core
,所谓的编译也就是执行项目下的Tasks--other--compileTestJava
,双击即可。
出现以下提示代表编译成功完成。
由于项目之间有依赖关系,所以编译顺序要严格按照下面的顺序来。
编译顺序:core-oxm-context-beans-aspect-aop-tx
编译完成后就可以创建自己的module。
由于我们用的gradle,因此创建module一定要选择gradle
下一步
完成即可
修改source-code-study中的依赖,配置如下 gradle dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' compile(project(":spring-beans")) compile(project(":spring-core")) compile(project(":spring-context")) compile(project(":spring-aop")) compile(project(":spring-aspects")) compile(project(":spring-tx")) }
编写启动类测试
```java package beanDefinition;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;
@Configuration //包扫描 @ComponentScan("beanDefinition") //使用xml文件启动 //@ImportResource("applicationContext.xml") public class Config { public Config() { System.out.println("------------------------Config实例化了"); } } ```
```java package beanDefinition;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringTest { public static void main(String[] args) throws InterruptedException { start1(); }
public static void start1() {
//其中Config.class可以指定为
//包扫描启动:@ComponentScan("tyrant")
//使用xml文件启动:@ImportResource("applicationContext.xml")
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan("beanDefinition");
//注册配置类
System.out.println("context.register(Config.class);前");
context.register(Config.class);
System.out.println("context.register(Config.class);后");
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClassName("beanDefinition.User");
//设置beanDefinition的属性值
beanDefinition.setAttribute("name","源码之路");
//设置对象的属性值
beanDefinition.getPropertyValues().addPropertyValue("name","排放量");
//将beanDefinition注册到spring容器中
context.registerBeanDefinition("userService",beanDefinition);
context.refresh();
//加载或者刷新当前的配置信息
User userService = (User) context.getBean("userService");
System.out.println("属性值" + userService.getName());
BeanDefinition userServiceBeanDefinition =
context.getBeanDefinition("userService");
System.out.println("——————InterService的附加属性如下:");
System.out.println("父类"+userServiceBeanDefinition.getParentName());
System.out.println("描述"+userServiceBeanDefinition.getDescription());
System.out.println("InterService在spring的名称"+ userServiceBeanDefinition.getBeanClassName());
System.out.println("实例范围"+userServiceBeanDefinition.getScope());
System.out.println("是否是懒加载"+userServiceBeanDefinition.isLazyInit());
System.out.println("是否是抽象类"+userServiceBeanDefinition.isAbstract());
System.out.println("hasAttribute"+userServiceBeanDefinition.hasAttribute("name"));
System.out.println("——————等等等等,读者自行编写");
BeanDefinition user =
context.getBeanDefinition("user");
System.out.println(user.getClass().getSimpleName());
BeanDefinition config =
context.getBeanDefinition("config");
System.out.println(config.getClass().getSimpleName());
}
public static void start2() { //其中Config.class可以指定为 //包扫描启动:@ComponentScan("tyrant") //使用xml文件启动:@ImportResource("applicationContext.xml") AnnotationConfigApplicationContext context = new
AnnotationConfigApplicationContext(Config.class); //加载或者刷新当前的配置信息 context.refresh(); } } ```
```java package beanDefinition;
import org.springframework.context.annotation.Description; import org.springframework.stereotype.Component;
@Component @Description("业务类") public class User { private int age =31; private String name;
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; } } ```
运行TestMethod之前,我们需要设置kotlin Compiler
,不设置的话,会出现以下提示而且运行很慢
Warning:Kotlin: Language version 1.1 is deprecated and its support will be removed in a future version of Kotlin
运行SpringTest
看看是否能够正确打印信息。如果能打印但是乱码。
增加以下配置
在idea中vm options最后一行加入 -Dfile.encoding=UTF-8
附录
1.gradle的仓库下载的依赖的目录 C:\Users\claude.peng\.gradle\caches\modules-2\files-2.1
当有依赖下载不下来我们可以在网上下载下来放在本地仓库。
2.阿里云云效 Maven 中央代理仓库,我们可以在这里下载找不到的依赖,自己创建目录放到本地仓库。
地址: https://developer.aliyun.com/mvn/search
3.编译源码的过程中可能还会遇到其他的问题,欢迎交流。笔者跟着自己写的教程重新编译了一次,没有任何问题,完美,收工~