prepare
-
下载idea2019.3.5并安装激活(具体的步骤看鸡哥在群里面发的压缩包)。
-
拉取spring5.3.5的源码(tips:建议先Star再Forked,然后回到自己账号的项目仓库再拉取):https://gitee.com/hhf1237/spring-framework
-
下载jdk15并解压:https://pan.baidu.com/s/1m8gwlKJ818Q6sjvZPSg9iQ 提取码:tm9n (tips:jdk 11及以上就ok),不需要配置环境变量,保持您的jdk8即可。
-
下载gradle,版本:gradle-6.4-rc-4:https://services.gradle.org/distributions/(tips:gradle版本要在5.6~6.5之间,和我保持一致即可),配置环境变量(变量名:GRADLE_HOME)。
-
检查环境变量:gradle -v
-
配置加速(可选)
-
Gradle 的jar包还是从 maven 仓库下载的。
-
给gradle安装目录下init.d文件夹,放一个init.gradle文件(复制粘贴进去,记得保存)。
gradle.projectsLoaded { rootProject.allprojects { buildscript { repositories { def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter' def GOOGLE_URL = 'https://maven.aliyun.com/repository/google' def NEXUS_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter' all { ArtifactRepository repo -> if (repo instanceof MavenArtifactRepository) { def url = repo.url.toString() if (url.startsWith('https://jcenter.bintray.com/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL." println("buildscript ${repo.url} replaced by $JCENTER_URL.") remove repo } else if (url.startsWith('https://dl.google.com/dl/android/maven2/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL." println("buildscript ${repo.url} replaced by $GOOGLE_URL.") remove repo } else if (url.startsWith('https://repo1.maven.org/maven2')) { project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL." println("buildscript ${repo.url} replaced by $REPOSITORY_URL.") remove repo } } } jcenter { url JCENTER_URL } google { url GOOGLE_URL } maven { url NEXUS_URL } } } repositories { def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter' def GOOGLE_URL = 'https://maven.aliyun.com/repository/google' def NEXUS_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter' all { ArtifactRepository repo -> if (repo instanceof MavenArtifactRepository) { def url = repo.url.toString() if (url.startsWith('https://jcenter.bintray.com/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL." println("buildscript ${repo.url} replaced by $JCENTER_URL.") remove repo } else if (url.startsWith('https://dl.google.com/dl/android/maven2/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL." println("buildscript ${repo.url} replaced by $GOOGLE_URL.") remove repo } else if (url.startsWith('https://repo1.maven.org/maven2')) { project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL." println("buildscript ${repo.url} replaced by $REPOSITORY_URL.") remove repo } } } jcenter { url JCENTER_URL } google { url GOOGLE_URL } maven { url NEXUS_URL } } } }
-
start
import source code
-
修改配置,改为:distributionUrl=https://services.gradle.org/distributions/gradle-6.4-rc-4-bin.zip(tips:根据gradle的版本修改即可,记得保存,需要配置环境变量)。
-
打开idea2019.3.5,随便打开一个现有项目。
-
File->New->Project from Existing Sources…
-
找到源码的文件位置,选中项目中最顶层的build.gradle,顶层的build.gradle,顶层的build.gradle(重要的事情说三遍)。
-
点击:This Window 或者 New Window,你也是可以完完全全点Cancel的,然后会有一个加载的窗口,立马点击取消,立马点击取消,立马点击取消(重要的事情要说三遍)。
-
设置idea的gradle和jdk(具体操作看图)
-
构建(具体操作看图)
-
wait…
- 建议去吃个饭,撩撩妹。
-
import success
-
设置Java Compiler
-
设置project SDK
-
修改spring-context 模块配置
dependencies { compile(project(":spring-aop")) compile(project(":spring-beans")) compile(project(":spring-core")) compile(project(":spring-expression")) // optional(project(":spring-instrument")) compile(project(":spring-instrument")) .... }
-
预编译 spring-core 模块
-
compiler success
-
添加依赖
-
创建一个测试的模块
- 项目名称、路径等这些信息自己看着办,然后点击启动Finish。
-
添加依赖
-
剩下的spring怎么用就怎么搞,不懂建议点击右上角的X,再见。
aop
-
先确认有下图中的相关jar包依赖,默认情况是预编译spring-core模块后就自动有了,如果没有需要手动添加,添加的方法下面会讲到。
如果没有jar依赖则需要手动添加:
-
下载安装AspectJ 支持:https://www.eclipse.org/aspectj/downloads.php
-
下载AspectJ 1.9.5
-
使用cmd命令cd到下载的目录下
-
在命令窗口输入java -jar aspectj-1.9.5.jar 安装
-
选择我们需要编译spring源码的jdk的根目录下
-
AspectJ 的安装目录(要记得位置,等一下要用到)
-
idea安装 AspectJ 插件,安装成功后重启idea。
-
更改编译器
-
spring-aop、spring-aspects的main中添加 AspectJ
-
重新Build一下(出现傻逼kt报错不用管它)
-
创建一个aop的测试模块,添加依赖,刷新加载模块。
dependencies { compile(project(":spring-context")) compile(project(":spring-aspects")) }
-
剩下的spring aop怎么用就怎么搞,不懂建议点击右上角的X,再见。
-
transaction
-
创建一个新模块,添加依赖
dependencies { compile(project(":spring-context")) compile(project(":spring-jdbc")) implementation group: 'mysql', name: 'mysql-connector-java', version: '5.1.49' implementation group: 'com.alibaba', name: 'druid', version: '1.2.8' testCompile group: 'junit', name: 'junit', version: '4.12' }
-
配置类
package com.qqs.tx; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; @Configuration @ComponentScan("com.qqs.tx") @EnableTransactionManagement public class TxConfiguration { /** * 配置数据源(账号密码、url自行配置) * @return */ @Bean public DataSource dataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setUsername("admin"); dataSource.setPassword("admin"); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/spring"); return dataSource; } @Bean public JdbcTemplate jdbcTemplate(){ return new JdbcTemplate(dataSource()); } /** * 配置事务管理器 * @return */ @Bean public PlatformTransactionManager transactionManager(){ return new DataSourceTransactionManager(dataSource()); } }
说明:mysql版本为5.7,如果是mysql8.0请自行查阅资料配置url参数。
-
剩下的业务类自己看着办,不懂建议点击右上角的X,再见。
web
-
创建一个新模块,添加依赖。
compile(project(":spring-webmvc")) optional group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
-
根容器配置类
@Configuration @ComponentScan(value = "com.qqs.mvc",excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class}) }) public class RootConfiguration { }
-
web ioc容器配置类
@Configuration @ComponentScan(value = {"com.qqs.mvc"},includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class}) },useDefaultFilters = false) public class AppConfiguration { }
-
WebAppInitializer
package com.qqs.mvc; import com.qqs.mvc.config.AppConfiguration; import com.qqs.mvc.config.RootConfiguration; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { /** * 获取根容器的配置类 * @return */ @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{RootConfiguration.class}; } /** * 获取web容器的配置类 * @return */ @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{AppConfiguration.class}; } /** * 获取DispatcherServlet的映射信息 * @return */ @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
-
WebMvcConfigurer (SpringMvc定制配置功能)
package com.qqs.mvc.config; // import com.qqs.mvc.Interceptor.MyHandlerInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.*; @EnableWebMvc // 开启SpringMvc定制配置功能 @Configuration public class MyWebMvcConfigurer implements WebMvcConfigurer { @Override public void configureViewResolvers(ViewResolverRegistry registry) { // 无参数默认 jsp("/WEB-INF/", ".jsp") registry.jsp("/WEB-INF/views/",".jsp"); } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { // 静态资源 configurer.enable(); } @Override public void addInterceptors(InterceptorRegistry registry) { // 配置拦截器 // registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/**"); } }
-
业务类和tomcat运行以前怎么搞就怎么搞,不会请自行百度。
hole
-
one
-
报错信息:
Information:java: com.sun.tools.javac.code.Symbol$CompletionFailure: 找不到jdk.internal.HotSpotIntrinsicCandidate的类文件 Information:java: Errors occurred while compiling module 'spring.spring-core.main' Information:javac 15.0.2 was used to compile java sources Information:Modules "spring.spring-ioc-test.main", "spring.spring-core.main" were fully rebuilt due to project configuration/dependencies changes Information:2022/2/23 13:57 - Build completed with 1 error and 0 warnings in 10 s 892 ms Error:java: Compilation failed: internal java compiler error
-
原因分析:jdk的配置存在问题。
-
解决方法:切换到其他jdk的版本点击ok,然后再切换回来
-
-
two
-
报错信息:
Error:(19, 15) java: 程序包jdk.jfr不存在
-
原因分析:当前编译的jdk版本中没有相关的类。
-
解决方法:修改idea中的java compiler的版本。
-
-
three
-
报错信息:
Error:ajc: Compliance level '1.8' is incompatible with target level '11'. A compliance level '11' or better is required Error:Internal error: bad args
-
原因分析:java compiler的jdk版本和project的jdk版本不一致。
-
解决方法:修改java compiler的版本和project的版本。
-
-
four
-
报错信息:
Error:(19, 49) java: 找不到符号 符号: 类 AnnotationBeanConfigurerAspect 位置: 程序包 org.springframework.beans.factory.aspectj Error:(47, 16) java: 找不到符号 符号: 类 AnnotationBeanConfigurerAspect 位置: 类 org.springframework.context.annotation.aspectj.SpringConfiguredConfiguration Error:(48, 24) java: 找不到符号 符号: 变量 AnnotationBeanConfigurerAspect 位置: 类 org.springframework.context.annotation.aspectj.SpringConfiguredConfiguration D:\workspace\spring-framework-5.1.x\spring-aspects\src\main\java\org\springframework\cache\aspectj\AspectJJCacheConfiguration.java Error:(42, 16) java: 找不到符号 符号: 类 JCacheCacheAspect 位置: 类 org.springframework.cache.aspectj.AspectJJCacheConfiguration Error:(43, 17) java: 找不到符号 符号: 类 JCacheCacheAspect 位置: 类 org.springframework.cache.aspectj.AspectJJCacheConfiguration Error:(43, 49) java: 找不到符号 符号: 变量 JCacheCacheAspect 位置: 类 org.springframework.cache.aspectj.AspectJJCacheConfiguration D:\workspace\spring-framework-5.1.x\spring-aspects\src\main\java\org\springframework\scheduling\aspectj\AspectJAsyncConfiguration.java Error:(43, 16) java: 找不到符号 符号: 类 AnnotationAsyncExecutionAspect 位置: 类 org.springframework.scheduling.aspectj.AspectJAsyncConfiguration Error:(44, 17) java: 找不到符号 符号: 类 AnnotationAsyncExecutionAspect 位置: 类 org.springframework.scheduling.aspectj.AspectJAsyncConfiguration Error:(44, 62) java: 找不到符号 符号: 变量 AnnotationAsyncExecutionAspect 位置: 类 org.springframework.scheduling.aspectj.AspectJAsyncConfiguration D:\workspace\spring-framework-5.1.x\spring-aspects\src\main\java\org\springframework\cache\aspectj\AspectJCachingConfiguration.java Error:(42, 16) java: 找不到符号 符号: 类 AnnotationCacheAspect 位置: 类 org.springframework.cache.aspectj.AspectJCachingConfiguration Error:(43, 17) java: 找不到符号 符号: 类 AnnotationCacheAspect 位置: 类 org.springframework.cache.aspectj.AspectJCachingConfiguration Error:(43, 53) java: 找不到符号 符号: 变量 AnnotationCacheAspect 位置: 类 org.springframework.cache.aspectj.AspectJCachingConfiguration D:\workspace\spring-framework-5.1.x\spring-aspects\src\main\java\org\springframework\transaction\aspectj\AspectJTransactionManagementConfiguration.java Error:(42, 16) java: 找不到符号 符号: 类 AnnotationTransactionAspect 位置: 类 org.springframework.transaction.aspectj.AspectJTransactionManagementConfiguration Error:(43, 17) java: 找不到符号 符号: 类 AnnotationTransactionAspect 位置: 类 org.springframework.transaction.aspectj.AspectJTransactionManagementConfiguration Error:(43, 56) java: 找不到符号 符号: 变量 AnnotationTransactionAspect 位置: 类 org.springframework.transaction.aspectj.AspectJTransactionManagementConfiguration
-
原因分析:spring源码的AOP使用了aspectJ ,而java不识别aspectJ。
-
解决方法:参考aop的配置流程重新配置一遍。
-
-
five
-
报错信息:
Error:(36, 41) java: 程序包org.springframework.oxm.jaxb.test不存在 Error:(37, 41) java: 程序包org.springframework.oxm.jaxb.test不存在 Error:(65, 17) java: 找不到符号 符号: 类 Flights 位置: 类 org.springframework.oxm.jaxb.Jaxb2UnmarshallerTests Error:(65, 36) java: 找不到符号 符号: 类 Flights 位置: 类 org.springframework.oxm.jaxb.Jaxb2UnmarshallerTests Error:(73, 17) java: 找不到符号 符号: 类 FlightType 位置: 类 org.springframework.oxm.jaxb.Jaxb2UnmarshallerTests
-
原因分析:spring-oxm 模块下 jaxb包不存在。
-
解决方法:spring-oxm模块重新 genJaxb
-
remark
- 本教程最终的代码:https://gitee.com/qqs12487489/spring
- 参考:https://blog.csdn.net/qq_38196479/article/details/104071904
- 尚硅谷牛逼!鸡哥牛逼!
ts
位置: 类 org.springframework.oxm.jaxb.Jaxb2UnmarshallerTests
Error:(65, 36) java: 找不到符号
符号: 类 Flights
位置: 类 org.springframework.oxm.jaxb.Jaxb2UnmarshallerTests
Error:(73, 17) java: 找不到符号
符号: 类 FlightType
位置: 类 org.springframework.oxm.jaxb.Jaxb2UnmarshallerTests* 原因分析:spring-oxm 模块下 jaxb包不存在。 * 解决方法:spring-oxm模块重新 genJaxb [外链图片转存中...(img-bpQ3iOkz-1645612538271)]
remark
- 本教程最终的代码:https://gitee.com/qqs12487489/spring
- 参考:https://blog.csdn.net/qq_38196479/article/details/104071904
- 尚硅谷牛逼!鸡哥牛逼!