小白鼠带你啃Spring源码之基础

 2023-01-22
原文作者:六脉神剑 原文地址:https://juejin.cn/post/7017751894038691870

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…
种一棵树最好的时间是十年前,其次是现在

絮叨

说实话,用Spring也一直在用,但是很多时候报个什么错,基本上还是无从下手,只能说去百度找答案,但是找问题答案的最好方式肯定是源码,而且这个面试也是经常问到的,所以这块是必须要会的,没办法只能自己从一个小白慢慢啃,大家一起从小白开始慢慢学咯。这个系列也是慢慢出,毕竟是Spring,我们只能说尽量的去理解他的思想,去学习它,要想精通,太难了。

如何看Spring源码

我这个系列不是讲Spring 是怎么样去用 是怎么去搭建一个Spring的环境,我的目的很简单就是,找几个方法,把Spring的源码过一下,不然到时候去面试没几个拿手的好戏,说说我在看Spring源码之前的准备工作吧

  • 首先Spring 是一个很大的项目 它里面有太多的子项目了,如下图 截至我写博客的时间2020-2-14 。它的官网刚好改版了,哈哈 如果大家经常去逛就知道以前它不长这样,

    202301012121007981.png 我们要讲的是里面的一个子项目,Spring Framework

202301012121015082.png

  • 第二个就是去看它的官方文档,我记得不知道哪个大佬说的,如果一个电器 你连说明书都没看,你就想去拆开了,你大概率会玩坏。所以第一步先看Spring的说明书。很重要,我英语很菜,但是我也是只能硬看,不一定要说很仔细,大概的模块看一下,心理有点数,就行
  • 还有就是自己去搭建一个Spring的源码环境,为啥这样做呢,因为你这样再学的过程,可以编写里面的源码,改里面的源码,还能做中文注释,如果想真的好好学习一下它,还是很有必要的,这一步搞了我一天,因为我的网速很慢,然后Spring是用Gradle的 所以搞了我很久我这边给个教程大家自己去玩 Spring5 源码编译
  • 找一个点 去读Spring源码,不要想着里面的一个模块一个模块来读,这样你会坚持不下去的。
  • 重复阅读:一次就可以将所有的代码都阅读明白的人是没有的。反复的去阅读同一段代码有助于得代码的理解。

什么是Spring

很喜欢以前老师说的一句话,哪一天Spring 停止不前了,那么Java这门语言怕是要到顶峰了。

Spring makes programming Java quicker, easier, and safer for everybody. Spring’s focus on speed, simplicity, and productivity has made it the world's most popular Java framework.

Spring使Java编程变得更快、更简单、更安全。Spring对速度、简单性和生产力的关注使它成为世界上最流行的Java框架。

  • Spring是一个非侵入式的框架,其目标是使应用程序对框架的依赖最小化,应用代码可以在没Spring或者其他容器的情况下运行
  • Spirng是一个一致的编程模型,使得它于应用服务器隔离开来
  • Spring推动了设计风格面向对象开发及面向接口编程的转变,提高了代码的可重用性

什么是Spring Framework

202301012121020823.png

Spring是一个开源的轻量级的Java开发框架。 简化应用程序的开发。 最主要的几个模块是 DI 依赖注入,事务管理 web应用开发,等等,其实我们一般面试聊也就是 ioc apo mvc这些 。

Spring IOC容器的设计和实现:BeanFactory和ApplicationContext

在Spring Ioc容器的设计中,我们可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这个容器只实现了容器的基本功能,另一个是ApplicationContext应用上下文,他作为容器的高级形态而存在。应用上下文在简单的容器你系列基础上,真加了许多的其他功能。下面我们对Spring IoC容器中这两种容器来做一个简单的分析

BeanFactory

202301012121026834.png

我们看其实BeanFactory的话,其实也没有啥东西,就是几个方法的重载,各种获得Bean ,看是否包含Bean的方法而已,然后看bean 是单列bean,还是原型bean

接下来 我们看看BeanFactoy的层次结构图

202301012121032935.png 具体的话,其实怎么说呢 我们可以看出BeanFactory是最简单的ioc容器了

202301012121040826.png

上面是几条IOC容器的实现图,其实也就是现在具体IOC容器的底层实现类

第一条线 从接口BeanFactory到HierachicalBeanFactory,再到ConfigurableBeanFactory,是一条主要的BeanFactory设计路径。

  • BeanFactory:定义基本容器规范,包括基本方法getBean();
  • HierachicalBeanFactory:继承自BeanFactory接口,增加getBeanParentFactory()功能,具备双亲容器的管理功能。
  • ConfigurableBeanFactory:定义一些对BeanFactory的配置功能,包括setBeanParentFactory()设置双亲IOC容器,通过addBeanPostProcessor()配置Bean后置处理器,等等。

202301012121046207.png 跟着这条线我们发现了2个IOC容器的实现 DefaultListableBeanFactory 和XmlBeanFactory,具体的后面再说

第二条接口设计主线是,以ApplicationContext应用上下文接口为核心的接口设计,这里涉及的主要接口有,从BeanFactory到ListableBeanFactory,再到ApplicationContext,再到我们常用的WebApplicationContext或者ConfigurableApplicationContext接口。我们常用的应用上下文基本都是WebApplicationContext或者ConfigurableApplicationContext接口的实现。

在这个接口体系中,ListableBeanFactory和HierachicalBeanFactory两个接口,连接BeanFactory接口的定义和ApplicationContext应用上下文的定义。在ListableBeanFactory接口中,细化了许多BeanFactory的接口功能,比如getBeanDefinitionNames()接口方法;HierachicalBeanFactory在上面已经提到过,对于ApplicationContext接口,它通过继承MessageSource和ResourceLoader,ApplicationEventPublisher接口,在BeanFactory简单IOC容器的基础上添加了许多对高级容器的特性支持。

202301012121051068.png 这个是关于Web应用的实现,实现还是蛮对的哈哈,到时候我也是抽取一两个讲讲

个接口系统是以BeanFactory和ApplicationContext为核心的。而BeanFactory又是IOC容器最基本接口,在ApplicationContext的设计中,一方面,可以看到它继承了BeanFactory接口体系中的ListableBeanFactory、AutowireCapableBeanFactory、HierachicalBeanFactory等BeanFactory的接口,具备了BeanFactory IOC基本功能,另一方面,通过继承MessageSource和ResourceLoader、ApplicationEventPublisher接口,BeanFactory为ApplicationContext赋予了更高的IOC容器特性。对于ApplicationContext而言,在Web环境中使用它,还设计了WebApplicationContext接口,而这个接口通过继承ThemeSource接口来扩充功能。

202301012121057449.png

然后我们看ApplicationContext的层次图,我们发现更多的实现,所以我再这边我就打算讲一些,几种不同的类吧,不可能说全部讲完的,Spring真的是太牛了

结尾

其实应该是写的很烂,这篇文章,我自己都不知道在写什么,可能自己对Spring理解不深,所以我就没往下写了,就把Spring ioc的一个大体的结构列了出来,就是下面的我也是会挑一些方面来讲,学习Spring还是需要系统的书籍或者是视频好点然后自己去走源码。

日常求赞

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是 真粉

创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见

六脉神剑 | 文 【原创】如果本篇博客有任何错误,请批评指教,不胜感激 !