Spring源码解析——如何阅读源码

最近没什么实质性的工作,正好有点时间,就想学学别人的代码。也看过一点源码,算是有了点阅读的经验,于是下定决心看下spring这种大型的项目的源码,学学它的设计思想。 这篇博文你可以了解到: 1 Spring jar包以及源码使用   2 简单的spring运行示例   3 利用断点调试程序,如何快速的阅读程序【快捷键等的使用】

  这次阅读的源码比较老了,是3.0.5版本的,由于正好手头有这个版本的源码,而且平时基本上也是用的这个版本Spring,因此后文的分析也都是针对这个版本。

如何使用jar包以及源码的source包

  首先,在工程右键,属性中,添加必要的jar包。

  选中必要的jar包,上面给出的源码jar包中,导入spring3.0.5中的所有jar包。

  其中lib内的是spring的jar包,用到哪个导入哪个,不知道的话,全部导入就行了。

  外面的几个jar包,用于日志以及mysql的驱动。commons-logging jar包是必须的,其他的随意吧。

不确定的话,lib外面的这几个jar包以及lib里面的都导入就行了。

  导入jar包后,点开jar包,选中source attachment进行编辑,链接到源码的jar包。

  选择相应的source源码包

  全部导入后,如下

spring样例

  首先是一个必要的POJO类,用于注入属性的值。

 1 package com.test.bean;
 2 
 3 public class Person {
 4     
 5     private String name;
 6     private int age;
 7     
 8     public String getName() {
 9         return name;
10     }
11     public void setName(String name) {
12         this.name = name;
13     }
14     public int getAge() {
15         return age;
16     }
17     public void setAge(int age) {
18         this.age = age;
19     }
20     public void info(){
21         System.out.println("name:"+getName()+" age:"+getAge());
22     }
23 }

  主函数,用于读取资源文件,获取bean,调用info方法

 1 package test.spring;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 
 6 import com.test.bean.Person;
 7 
 8 public class Test {
 9     public static void main(String[] args){
10         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");//读取bean.xml中的内容
11         Person p = ctx.getBean("person",Person.class);//创建bean的引用对象
12         p.info();
13     }
14 }

  bean.xml用于配置bean的资源文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://www.springframework.org/schema/beans"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 6     <bean id="person" class="com.test.bean.Person">
 7         <property name="name" value="xingoo"/>
 8         <property name="age" value="12"/>
 9     </bean>
10 </beans>

  运行结果

阅读源码

  首先,有了前面的jar包以及源码包,你就可以通过这个简单的程序,进行但不的调试,阅读源码。

  简单的说下调试的快捷键:

  1 F5:下一步,可以进入下一个函数栈

  2 F6:当前函数的下一步,不会进入其他的函数。

  3 F8:下一个断点。

  4 也可以通过选中一个变量或者表达式,按ctrl+shift+i 来查看内容。或者添加监视的方式,查看。

  5 可以通过快捷键F2,来查看一个函数方法的javadoc,即说明

  6 快捷键F3或者ctrl+鼠标点击,进入一个函数

  7 ctrl+shift+G 查看当前方法都有谁在使用

  8 F4查看类的继承关系,可以向上显示出类继承的父类以及接口。

有了调试的方法,接下来,就是如何阅读源码了!

  1 参考书籍,推荐《Spring技术内幕》

  这本书,基本上很详细的讲述了,spring的实现方式,以及类之间的复杂关系。可以帮助你快速的理清复杂的类之间的关系。

  2 使用StarUML画类图

  比如你好不容易理清了一个部分的关系,很快就会忘记其中的关系,那么可以通过这个工具,简单的画出其中的复杂关系。

  这样,下一次看的时候也会清楚一些,这是我今天刚画好的ClassPathXmlApplicationContext的类图关系:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏草根专栏

用ASP.NET Core 2.0 建立规范的 REST API -- DELETE, UPDATE, PATCH 和 Log

本文所需的一些预备知识可以看这里: http://www.cnblogs.com/cgzl/p/9010978.html 和 http://www.cnblog...

1212
来自专栏xingoo, 一个梦想做发明家的程序员

cuda编程知识普及

本帖经过多方整理,大多来自各路书籍《GPGPU编程技术》《cuda高性能》 1 grid 和 block都可以用三元向量来表示: grid的数组元素是bloc...

3106
来自专栏Android常用基础

粗谈Java虚拟机之原理与结构

在学习java虚拟机之前,我们有必要先来了解下下class文件与dex文件。相比大家对这两文件都耳熟能详,但是对于初学者来说却是"听起声而不见其人"。下面我们就...

971
来自专栏企鹅号快讯

一文学会Python协程

Python圣诞学习狂欢夜 距离开始还有3天 . . . 详情 . . . 生成器和协程的介绍 生成器(Generator)的本质和特点 生成器 是 可以生成一...

30110
来自专栏编程

java编程思想之并发

编程问题中的相当一大部分都可以通过顺序编程来解决。然而,对于某些问题,如果能够并行的执行程序中的多个部分,则会变得非常方便甚至非常必要,这些部分要么可以并发执行...

2107
来自专栏java技术学习之道

Java线程面试题合集(含答案)

2144
来自专栏耕耘实录

Linux三大剑客之sed

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢。联系本人:ecsboy(微信),136625317(QQ)...

1292
来自专栏Vamei实验室

Linux从程序到进程

计算机如何执行进程呢?这是计算机运行的核心问题。即使已经编写好程序,但程序是死的。只有活的进程才能产出。我们已经从Linux进程基础中了解了进程。现在我们看一下...

2229
来自专栏Python中文社区

PyQt的一个UI单元测试框架思路

專 欄 ❈丁果,Python中文社区作者。对django、pyqt、opencv、tornado感兴趣。 GitHub:https://github.com/...

2956
来自专栏Flutter入门到实战

Android插件化开发核心类ClassLoader相关详解

最近在研究插件化开发,顺便就了解了 ClassLoader 这个类加载器,顺藤摸瓜,查到了jvm里面的双亲委派模型,这里就简单的讲一下什么是预定义类加载器和双亲...

1243

扫码关注云+社区

领取腾讯云代金券