spring源码5导入idea2019.3.5

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)。

    image-20220221095551628

image-20220221100302894

  • 检查环境变量:gradle -v

    image-20220221104508320

  • 配置加速(可选)

    • 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的版本修改即可,记得保存,需要配置环境变量)。

    image-20220221104740468

  • 打开idea2019.3.5,随便打开一个现有项目。

  • File->New->Project from Existing Sources…

  • 找到源码的文件位置,选中项目中最顶层的build.gradle,顶层的build.gradle,顶层的build.gradle(重要的事情说三遍)。

    image-20220221101934857

  • 点击:This Window 或者 New Window,你也是可以完完全全点Cancel的,然后会有一个加载的窗口,立马点击取消,立马点击取消,立马点击取消(重要的事情要说三遍)。

    image-20220221102402424

  • 设置idea的gradle和jdk(具体操作看图)

    65464

  • 构建(具体操作看图)

    QQ截图20220221113408

  • wait…

    • 建议去吃个饭,撩撩妹。
  • import success

    QQ截图20220221114826

  • 设置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"))
        ....
    }
    

    image-20220221131752252

  • 预编译 spring-core 模块

  • compiler success

    image-20220221122044264

  • 添加依赖

    image-20220221122355640

    image-20220221122653190

image-20220221122733612

  • 创建一个测试的模块

    image-20220221132145285

    • 项目名称、路径等这些信息自己看着办,然后点击启动Finish。
  • 添加依赖

    image-20220221140425900

  • 剩下的spring怎么用就怎么搞,不懂建议点击右上角的X,再见。

aop

  • 先确认有下图中的相关jar包依赖,默认情况是预编译spring-core模块后就自动有了,如果没有需要手动添加,添加的方法下面会讲到。

    image-20220223144003598

    如果没有jar依赖则需要手动添加:
    image-20220223144207370

    image-20220223144307754

  • 下载安装AspectJ 支持:https://www.eclipse.org/aspectj/downloads.php

    • 下载AspectJ 1.9.5

      image-20220223144702782

    • 使用cmd命令cd到下载的目录下

      image-20220223145101077

    • 在命令窗口输入java -jar aspectj-1.9.5.jar 安装

      image-20220223145301925

    • 选择我们需要编译spring源码的jdk的根目录下

      image-20220223145512787

    • AspectJ 的安装目录(要记得位置,等一下要用到)

      image-20220223145818116

    • idea安装 AspectJ 插件,安装成功后重启idea。

      image-20220223151418816

    • 更改编译器

    • spring-aop、spring-aspects的main中添加 AspectJ

      image-20220223155846091

      img

    • 重新Build一下(出现傻逼kt报错不用管它)

      image-20220223171654031

    • 创建一个aop的测试模块,添加依赖,刷新加载模块。

      dependencies {
          compile(project(":spring-context"))
          compile(project(":spring-aspects"))
      }
      

      456f465asd4f

    • 剩下的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'
    }
    

    image-20220223173304510

  • 配置类

    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

  • 创建一个新模块,添加依赖。

    image-20220223174302724

    compile(project(":spring-webmvc"))
    optional group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
    

    image-20220223180401570

  • 根容器配置类

    @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
      

      image-20220223140110091

    • 原因分析:jdk的配置存在问题。

    • 解决方法:切换到其他jdk的版本点击ok,然后再切换回来

      image-20220223141634364

  • two

    • 报错信息:

      Error:(19, 15) java: 程序包jdk.jfr不存在
      

      image-20220223142201319

    • 原因分析:当前编译的jdk版本中没有相关的类。

    • 解决方法:修改idea中的java compiler的版本。

      image-20220223142351764

  • 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的版本。

      image-20220223142351764

      image-20220223142819887

  • 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。

      image-20220223155539233

    • 解决方法:参考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

      image-20220223161528267

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
  • 尚硅谷牛逼!鸡哥牛逼!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值