【Spring6源码阅读】-引言

470 阅读1分钟

源码学习是程序员修炼晋升的必经之路,我曾经也尝试过几次去把spring源码啃下来,但是均不尽如人意,结果无一例外都无疾而终。因此在这里以读书笔记的形式把这次探险经历记录下来,一方面鞭策自己,另一方面给同样困惑的同学一些参考和鼓励。
本系列主题:
引言

环境搭建

  • IntelliJ IDEA 2024.1.1
  • JDK 17.0.3.1
  • Gradle 8.7
  • spring-framework 6.1.x
  • mac

jdk安装

源码需要用到jdk17,而现在通用的是jdk8,需要安装多个jdk版本,这里推荐使用jenv来管理jdk版本。

1、安装jenv

brew install jenv

2、配置环境

echo $0
查看shell是zsh还是bash,mac一般是zsh。
bash

echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(jenv init -)"' >> ~/.bash_profile

zsh

echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc

3、安装jdk17

brew install openjdk@17

4、查看本地安装的jdk版本

/usr/libexec/java_home -V
**➜** **spring-framework** **git:(** **6.1.x** **)** /usr/libexec/java_home -V

Matching Java Virtual Machines (4):
    17.0.3.1 (x86_64) "Oracle Corporation" - "Java SE 17.0.3.1" /Library/Java/JavaVirtualMachines/jdk-17.0.3.1.jdk/Contents/Home
    11.0.15 (x86_64) "Oracle Corporation" - "Java SE 11.0.15" /Library/Java/JavaVirtualMachines/jdk-11.0.15.jdk/Contents/Home
    1.8.333.02 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
    1.8.0_333 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-17.0.3.1.jdk/Contents/Home

5、添加到jenv管理

jenv add /Library/Java/JavaVirtualMachines/jdk-17.0.3.1.jdk/Contents/Home

6、切换jdk版本

# 查看安装的版本
jenv versions
# 切换版本(全局)
jenv global 17.0
# 切换版本(本地)
jenv local 1.8

github.com/jenv/jenv

gradle安装

1、下载gradle 8.7

gradle.org/install/

2、配置环境

echo 'GRADLE_HOME=your_gradle_path' >> ~/.zshrc
echo `export PATH=$PATH:$GRADLE_HOME/bin`>> ~/.zshrc

源码下载

建议采用fork的方式从github.com/spring-proj… 克隆,后续可以将测试代码、注释等推送到仓库。

  1. 通过idea的File->New->Project From Version Control下载代码;
  2. 设置上游代码库:
git remote add upstream https://github.com/spring-projects/spring-framework
  1. 获取最新代码版本,merge到本地分支;
git fetch upstream
git merge upstream/master
  1. 切换到6.1.x分支
git checkout 6.1.x

idea环境配置

image.png

image.png

源码编译

image.png 选择按照操作处理即可,即

  1. 先编译spring-oxm;
  2. 在代码结构中将spring-aspects从module中去除;

测试

  1. 新建module image.png
  2. 修改module的version='8.7',增加依赖
api(project(":spring-context"))

image.png 3. 写一个启动类和相关的类

@ComponentScan("com.charles.spring.sample.**")
public class SpringSampleApplication {

    private SpringSampleApplication() {}

    public static void main(String[] args) {
       AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
             SpringSampleApplication.class
       );

       IPersonService personService = context.getBean(IPersonService.class);
       personService.speak();
    }
}
public interface IPersonService {
    /**
     * 说
     */
    void speak();
}
@Component
@Primary
public class ChineseService implements IPersonService {
    @Override
    public void speak() {
       System.out.println("Say Chinese!");
    }
}
@Component
public class AmericanService implements IPersonService{
    @Override
    public void speak() {
       System.out.println("Say English!");
    }
}
  1. 运行 image.png

enjoy~