阅读Spring源码第一步:源码编译与创建调试入口

简介: Spring开源框架经过很长时间的发展,各个模块均已成熟,一个常识就是一个可靠,可扩展的高性能框架,它的代码行数是相当可观的,我用static插件简略测算了一下,Spring的源码有100多万行,可以想象其中的调用逻辑是相当复杂的,所以将Spring源码下载到本地再编译的话,我们就可以通过IDE的debug来来到抽丝剥茧分析源码的目的,并且我们可以很方便的使用idea来查看调用栈,方法的调用关系也就比较明了了。

1 源码下载与编译


 Spring开源框架经过很长时间的发展,各个模块均已成熟,一个常识就是一个可靠,可扩展的高性能框架,它的代码行数是相当可观的,我用static插件简略测算了一下,Spring的源码有100多万行,可以想象其中的调用逻辑是相当复杂的,所以将Spring源码下载到本地再编译的话,我们就可以通过IDE的debug来来到抽丝剥茧分析源码的目的,并且我们可以很方便的使用idea来查看调用栈,方法的调用关系也就比较明了了。


下载Spring源码:https://github.com/spring-projects/spring-framework/tree/v5.2.0.RELEASE


Spring是通过gradle构建的:https://www.zhihu.com/question/30432152


 gradle可以在不安装的情况下提供一个一键运行的脚本,打开Spring源码的根目录,找到build.gradle文件,添加阿里云镜像:


repositories {
        maven{ url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
    }


33.png34.png


将Spring源码导入到idea中:https://mp.weixin.qq.com/s/FIjGS13J10DF9_bqohYVjQ


导入完毕后要将spring-aspects排除出去,右键,load/unload modules,将其unload再重新build


看源码之前要先读一下spring的文档:

https://docs.spring.io/spring-framework/docs/current/reference/html/


2 创建学习入口


spring源码下载到本地后,为了调试我们还要创建一个程序入口。


创建一个新模块spring-demo,目的是引用上面那些模块的服务,作为后面调试的入口。


新建service接口:


package com.wjw.service;
public interface WelcomeService {
   String sayHello(String name);
}


具体实现类实现一下:


package com.wjw.service.impl;
import com.wjw.service.WelcomeService;
public class WelcomeServiceImpl implements WelcomeService {
   @Override
   public String sayHello(String name) {
      System.out.println("欢迎你:" + name);
      return "success";
   }
}


创建resources/spring/spring-config.xml生成一个bean:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
   <bean id="welcomeService" class="com.wjw.service.impl.WelcomeServiceImpl"/>
</beans>


创建程序主入口,读取xml文件,获取bean并执行方法:


package com.wjw;
import com.wjw.service.WelcomeService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Entrance {
   public static void main(String[] args) {
      System.out.println("Hello World!");
      String xmlPath = "F:\\Java\\spring-framework-5.2.0.RELEASE\\springdemo\\src\\main\\resources\\spring\\spring-config.xml";
      ApplicationContext applicationContext = new FileSystemXmlApplicationContext(xmlPath);
      WelcomeService welcomeService = (WelcomeService) applicationContext.getBean("welcomeService");
      welcomeService.sayHello("强大的spring框架");
   }
}

此外还可以使用另一种注释的方式,来保证启动时将WelcomeServiceImpl的实例加载到容器里:


35.png


36.png


打印结果:


37.png


最后再提一句官网对软件版本的命名规则:


GA:General Availability,官方正式发布的稳定版本

同质的还有RELEASE,Stable,Final

RC:Release Candidate,发行候选版本,基本不再加入新的功能

Alpha:内部测试版本,bug较多,功能不全

Beta:公开测试版,比Alpha版本晚些,还会加功能,修bugumuoamn

M:Milestone,开发期发行版本,边开发边发行


相关文章
|
7月前
|
Java 应用服务中间件 Spring
Spring5源码(50)-SpringMVC源码阅读环境搭建
Spring5源码(50)-SpringMVC源码阅读环境搭建
82 0
|
4月前
|
消息中间件 存储 Java
手动实现 Spring Boot 日志链路追踪:提升调试效率的利器
【8月更文挑战第8天】在复杂的分布式系统中,日志是诊断问题、追踪系统行为的重要工具。然而,随着微服务架构的普及,服务间的调用链路错综复杂,传统的日志记录方式往往难以快速定位问题源头。今天,我们将探讨如何在不依赖外部组件(如Zipkin、Sleuth等)的情况下,手动实现Spring Boot应用的日志链路追踪,让日志定位更加便捷高效。
198 1
|
6月前
|
存储 Java 程序员
Spring 注册BeanPostProcessor 源码阅读
Spring 注册BeanPostProcessor 源码阅读
|
2月前
|
监控 Java 对象存储
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
49 1
|
4月前
|
存储 缓存 Java
面试问Spring循环依赖?今天通过代码调试让你记住
该文章讨论了Spring框架中循环依赖的概念,并通过代码示例帮助读者理解这一概念。
面试问Spring循环依赖?今天通过代码调试让你记住
|
4月前
|
XML Java 数据库
"揭秘!Spring Boot日志链路追踪大法,让你的调试之路畅通无阻,效率飙升,问题无所遁形!"
【8月更文挑战第11天】在微服务架构中,请求可能跨越多个服务与组件,传统日志记录难以全局追踪问题。本文以电商系统为例,介绍如何手动实现Spring Boot应用的日志链路追踪。通过为每个请求生成唯一追踪ID并贯穿全链路,在服务间传递该ID,并在日志中记录,即使日志分散也能通过ID串联。提供了实现这一机制所需的关键代码片段,包括使用过滤器设置追踪ID、业务代码中的日志记录及Logback配置。此方案显著提升了问题定位的效率,适用于基于Spring Boot构建的微服务环境。
111 4
|
4月前
|
Java API 开发者
【开发者福音】Spring Boot 异常处理:优雅应对错误,提升应用健壮性,让调试不再是噩梦!
【8月更文挑战第29天】本文通过对比传统错误处理方式与Spring Boot推荐的最佳实践,展示了如何在Spring Boot应用中实现统一且优雅的异常处理。传统方法需在每个可能出错的地方显式处理异常,导致代码冗余且不一致。而Spring Boot的全局异常处理机制则能集中处理所有异常,简化代码并确保错误响应格式统一,提高应用程序的健壮性和可维护性。文中提供了具体的示例代码以帮助读者更好地理解和应用这一机制。
127 0
|
5月前
|
Java 数据库连接 Spring
搭建 spring boot + mybatis plus 项目框架并进行调试
搭建 spring boot + mybatis plus 项目框架并进行调试
102 4
|
7月前
|
监控 IDE Java
Java项目调试实战:如何高效调试Spring Boot项目中的GET请求,并通过equalsIgnoreCase()解决大小写不一致问题
Java项目调试实战:如何高效调试Spring Boot项目中的GET请求,并通过equalsIgnoreCase()解决大小写不一致问题
111 0