一. 前言 Spring家族特别庞大,对于开发人员而言,要想全面征服Spring家族,得花费不少的力气.俗话说,打蛇打七寸,那么Spring家族的"七寸"是什么呢?我心目中的答案一直都是 Spring Framework! 本篇文章记录我自己在学习Spring Framework的过程中的一小部分源码解读和梳理,来谈一谈Spring 容器在启动过程中是如何扫描Bean的. 二. 学习方法论 我相信每个想变成优秀的开发人员都想弄懂Spring源码,我亦如此.于是通过很多途径来找Sprin…
前言 前文介绍了Spring中的BeanDefinition的细节,随着Spring的启动流程,这节我们介绍Spring的后续处理过程 - Spring的扩展点: BeanFactoryPostProcessor - BeanFactory后置处理处理器 BeanPostProcessor - Bean后置处理器 Spring扩展体系 Spring框架的设计的优异自不用说,使用者应该都深有体会.作为应用开发者,通常需要扩展Spring的处理,但是不必实现ApplicationContext或者扩…
前言 前文介绍了Spring Bean的生命周期,也算是XML IOC系列的完结.但是Spring的博大精深,还有很多盲点需要摸索.整合前面的系列文章,从Resource到BeanDefinition,再到容器扩展点,最后到Bean创键,这个过程中无处不存在Spring预留的扩展口. 本篇文章介绍Spring的另一种扩展点:BeanDefinition扩展点,该扩展点是为处理BeanDefinition而设计.本文主要从以下几点分析: BeanDefinition扩展点的几种方式 BeanDef…
Ioc容器依赖注入-Spring 源码系列(2) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostProcessor-Spring 源码(3) 事件机制-Spring 源码(4) 上篇中组装出了一个beanName:beanDefinition的ConcurrentHashMap,接下来就是把这些bean像织网一样联系起来. 从AbstractBeanFactory的getBean方法入手: @Ov…
Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostProcessor-Spring 源码(3) 事件机制-Spring 源码(4) AOP执行增强-Spring 源码系列(5) 1,理解控制反转   以前一直说着这个词,然后把它等于上ioc这个词,再等于上代码里一个bean里依赖了其他bean,不用new,用注解,用xml去描述,就…
Ioc容器BeanPostProcessor-Spring 源码系列(3) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostProcessor-Spring 源码(3) 事件机制-Spring 源码(4) 如果这个接口的某个实现类被注册到某个容器,那么该容器的每个受管Bean在调用初始化方法之前,都会获得该接口实现类的一个回调.容器调用接口定义的方法时会将该受管Bean的实例和名字通过参数传入方法,…
一.前言 回顾 在Spring源码系列第二篇中介绍了Environment组件,后续又介绍Spring中Resource的抽象,但是对于上下文的启动过程详解并未继续.经过一个星期的准备,梳理了Spring中的BeanDefinition以及它的解析和注册过程.本文着重介绍其特点及用途并延续前面上下文启动过程的步骤继续分析源码. 目录 本文主要从以下几个方面介绍BeanDefinition 什么是BeanDefinition BeanDefinition解析注册过程及组件概览 从路径到资源加载 资…
前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 本文内容: AbstractApplicationContext#refresh前部分的一点小内容 BeanFactoryPostProcessor调用过程详解 mybatis是如何使用本节知识整合spring的? 正文: 在Spring中,一共分为BeanFactoryPostProcessor和BeanPostProcessor两类后置处理器,他们主要的职责如下: BeanFactoryPo…
事件机制-Spring 源码系列(4) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostProcessor-Spring 源码(3) 事件机制-Spring 源码(4) ApplicationEvent 事件抽象类 ApplicationListener 监听器接口 ApplicationContext 事件源 事件源触发事件后,将事件通知给监听器,监听器执行相应逻辑的过程   使用简单的实现: 事…
前言 前文中主要介绍了Spring中处理BeanDefinition的扩展点,其中着重介绍BeanDefinitionParser方式的扩展.本篇文章承接该内容,详解Spring中如何利用BeanDefinitionParser的特性实现注解配置的解析.本文主要从以下几个方面介绍Spring中的注解配置解析原理: @Component系注解配置的作用原理 @Autowired注解配置的作用原理 无论注解配置还是XML配置,只是外在配置形式的变化,但是Spring的核心仍然是相同的: @Compo…
前言 上篇文章中介绍了Spring容器的扩展点,这个是在Bean的创建过程之前执行的逻辑.承接扩展点之后,就是Spring容器的另一个核心:Bean的生命周期过程.这个生命周期过程大致经历了一下的几个阶段 在本节中重点介绍实例化.填充装配.唤醒Aware方法.BeanPostProcessor后置处理.初始化等过程.关于Bean的销毁过程这里不再介绍.由于Bean的生命周期的维护过程实际上都是由BeanFactory负责,所以在开始Bean的生命周期过程详解之前,先概览性了解BeanFactor…
简介 spring-bean 组件是 Spring IoC 的核心,我们可以使用它的 beanFactory 来获取所需的对象,对象的实例化.属性装配和初始化等都可以交给 spring 来管理. 本文将从DefaultListableBeanFactory.getBean(Class)方法开始分析获取 bean 的过程,主要内容如下,由于篇幅较长,可以根据需要选择阅读: beanFactory 的设计 多个 beanName 的处理 获取单例 bean 创建单例 bean bean 的实例化 b…
AOP增强实现-Spring 源码系列(5) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostProcessor-Spring 源码(3) 事件机制-Spring 源码(4) AOP执行增强-Spring 源码系列(5) AOP的核心就是个动态代理,Spring进行了大量抽象和封装形成一个方便上层使用的基础模块. 而动态代理的两种实现都在上一篇中提供了代码 直接ProxyFactoryBean入手来…
写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spring的整体思路就是按部就班的读取标签并把数据放入一个map集合中以备后用. ps:以前在看别人写博客时没有很注意,到自己写才发现:博文一长,如何去维持文章的可读性,让读者在阅读时理清整篇文章的脉络实在是一件很难的事情.上篇文章就是如此,我自己回头去读时都难以去顺畅的学习,何况他人,甚是惭愧.也尝试数…
写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Document对象,处理完profile后终于到了标签的解析,这篇文章主要来探究Spring默认标签的解析. 1.4 BeanDefinition的创建 - 处理Spring默认标签 protected void parseBeanDefinitions(Element root, BeanDefiniti…
写在前面 上文 Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件主要讲Spring容器创建时通过XmlBeanDefinitionReader读取配置文件,将其经过编码并经过系列处理后,交给了同类中的doLoadBeanDefinitions()方法,这次就直接进入这个方法,来看看Spring到底是如何创建BeanDefinition的. 1.2 BeanDefinition的创建 - 创建BeanDefinition前的最终准备 首先进入…
写在前面 从大四实习至今已一年有余,作为一个程序员,一直没有用心去记录自己工作中遇到的问题,甚是惭愧,打算从今日起开始养成写博客的习惯.作为一名java开发人员,Spring是永远绕不过的话题,它的设计精巧,代码优美,值得每一名开发人员学习阅读. 在我最开始学习javaEE时,第一次接触Spring是从一个S(Struts)S(Spring)H(Herbinate)的框架开始.由java原生开发到框架开发转换过程中,那时我的印象里Struts负责控制层,herbinate负责数据层,而Sprin…
简介 spring-aop 用于生成动态代理类(底层是使用 JDK 动态代理或 cglib 来生成代理类),搭配 spring-bean 一起使用,可以使 AOP 更加解耦.方便.在实际项目中,spring-aop 被广泛用来实现日志.权限.事务.异常等的统一管理. 上一篇博客(Spring源码系列(三)--spring-aop的基础组件.架构和使用)简单讲了 spring-aop 的基础组件.架构和使用方法,本文将开始研究 spring-aop 的源码,主要分成以下部分: spring-aop…
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring源码-IOC部分-Xml Bean解析注册过程[3] Spring源码-IOC部分-自定义IOC容器及Bean解析注册[4] Spring源码-IOC部分-Bean实例化过程[5] Spring源码-IOC部分-Spring是如何解决Bean循环依赖的[6] 有两种情况会触发bean的实例化:一种是…
简介 前面已经讲完 spring-bean( 详见Spring ),这篇博客开始攻克 Spring 的另一个重要模块--spring-aop. spring-aop 可以实现动态代理(底层是使用 JDK 动态代理或 cglib 来生成代理类),在项目中,一般被用来实现日志.权限.事务等的统一管理. 我将通过两篇博客来详细介绍 spring-aop 的使用.源码等.这是第一篇博客,主要介绍 spring-aop 的组件.架构.使用等. 项目环境 maven:3.6.3 操作系统:win10 JDK…
探索spring源码实现,精华的设计模式,各种jdk提供的陌生api,还有那么点黑科技都是一直以来想做的一件事!但是读源码是一件非常痛苦的事情,需要有很大的耐心和扎实的基础. 在曾经读两次失败的基础上,这次希望能一站到底!这个系列基于spring v4.3.20版本探索. Spring上下文启动加载过程的分段 spring上下文的实现非常多,其中基于Xml启动的有ClassPathXmlApplicationContext.FileSystemXmlApplicationContext等等.这些…
何为Envoriment Envoriment是集成在Spring上下文容器中的核心组件,在Spring源码中由Envoriment接口抽象. 在Environment中,有两大主要概念: Profile:在Spring中profile是针对Bean定义而言,是Bean定义的逻辑分组.通常表现为:dev/test/production等等,对于Bean定义属于哪个profile是由XML或者Annotation配置决定: Properties:即键值对(Keys-Pairs),在Spring中将…
1. 读源码的方法 java程序员都知道读源码的重要性,尤其是spring的源码,代码设计不仅优雅,而且功能越来越强大,几乎可以与很多开源框架整合,让应用更易于专注业务领域开发.但是能把spring的源码吃透,不仅需要花费大量时间与精力,更需要需要掌握一些方法.下面结合自己读源码与走过的一些弯路,结合网上知名博客专家的建议,整理出以下要点,与读者共勉. 1.1 重视官方英文文档 spring的官方文档写的非常全面,基本可以认为是spring源码思想的一手来源,上面有很多例子不仅帮助读者如何应用,…
这里主要对springIOC接口体系进行简单的概述和分析,具体每个接口详细分析在下面目录: 参考内容: <Spring技术内幕:深入解析 Spring架构与设计原理> 和 <Spring源码深度解析(第2版)> 源码查看工具: idea,spring版本5.2.0 一 主要接口设计图 idea查看接口关系图,可在图中删除新增画出自定义的关系图,使用del和查看实现类快捷键(ctrl+alt+b)点击即可删除和增加类图 二 第一条线 通过BeacFactory->Hierarc…
简介 spring-bean 组件是 IoC 的核心,我们可以通过BeanFactory来获取所需的对象,对象的实例化.属性装配和初始化都可以交给 spring 来管理. 针对 spring-bean 组件,我计划分成两篇博客来讲解.本文会详细介绍这个组件,包括以下内容.下一篇再具体分析它的源码. spring-bean 组件的相关概念:实例化.属性装配.初始化.bean.beanDefinition.beanFactory. bean 组件的使用:注册bean.获取bean.属性装配.处理器等…
想对spring框架进行深入的学习一下,看看源代码,提升和沉淀下自己,工欲善其事必先利其器,还是先搭建环境吧. 环境搭建 sping源码之前是svn管理,现在已经迁移到了github中了,新版本基于gradle构建项目.所以构建sping源码环境必须先安装github以及Gradle. 当然了如果不想安装github客户端可以直接去git下载项目:spring中git地址https://github.com/spring-projects/spring-framework 安装github 首先…
关于IOC容器的初始化,结合之前SpringMVC的demo,对其过程进行一个相对详细的梳理,主要分为几个部分: 一.IOC的初始化过程,结合代码和debug过程重点说明 1. 为什么要debug? 答:直接自己从源码看第一遍,会有一个初步的认识:但是看完之后,会因为没有实际走一遍执行而无法验证自己认知的过程:另外就是:因为基于接口本身会有多个实现,因此在很多情况下,通过Ctrl+B直接会进入到接口中,但是方法的实现体为空,通过Ctrl+Alt+B查看具体实现,会出现多个类都实现了这个方法,具体…
1. BeanDefinition简介 前面讲的解析bean标签,本质就是将bean的信息封装成BeanDefinition对象的过程,最后放入容器beanDefinitionMap中.spring 要根据 BeanDefinition对象来实例化bean,只要把解析的标签,扫描的注解类封装成BeanDefinition对象,spring才能实例化bean. BeanDefinition有三个实现类,ChildBeanDefinition.GenericBeanDefinition.RootBe…
只要不放弃,希望迟早都会到来! 1. Bean的初始化 如果把bean的生命周期看作一个婴儿诞生过程的,那么创建实例相当于婴儿从母体出来,一丝不挂光秃秃:属性赋值相当于给宝宝的头带帽子,上身穿衣服.下神穿裤子.还有脚丫穿袜子:而初始化相当于教宝宝一些常规的动作,比如给宝宝吸奶,打嗝拍打,哄睡觉等,本篇继续分析初始化源码. 2. 初始化流程概览 3. 源码分析 进入initializeBean方法: protected Object initializeBean(String beanName,…
写在前面 上面四篇文章讲了Spring是如何将配置文件一步一步转化为BeanDefinition的整个流程,下面就到了正式创建Bean对象实例的环节了,我们一起继续学习吧. 2.初始化Bean对象实例 Resource resource = new ClassPathResource("beanFactory.xml"); BeanFactory beanFactory = new XmlBeanFactory(resource); Student student = beanFact…