spring源码
文章平均质量分 79
spring5.0.7源码分析
Bronze5
一个普通的Java爱好者
展开
-
Spring源码:ApplicationContext启动之后都做了哪些事?
一、介绍使用ApplicationContext启动Spring容器时,代码如下:ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml");这行代码,包含了整个Spring启动的全部过程,中间会经历很多步骤。我们今天探讨的是,这些很多步骤中的最后一步:finishRefresh()目的是为了看看容器中,所有的Bean实例都原创 2020-05-24 18:05:03 · 573 阅读 · 0 评论 -
Spring源码:ApplicationContext之提前加载单例Bean
一、介绍 标题中强调指出ApplicationContext,是因为使用Spring框架有两种方式:BeanFactory和ApplicationContext,代码如下: // beanFactory方式 @Test public void beanFactoryTest() { Resource classPathResource = new ClassPathResource("applicationContext.xml"); BeanFacto原创 2020-05-21 22:01:28 · 1315 阅读 · 0 评论 -
spring源码:Spring监听器实现原理
一、前言 Spring中的监听器是一个典型的观察者模式,谈到观察者模式就一定有一个观察者和被观察者。Spring中监听器的设计如下:观察者:ApplicationListener监听器被观察者:ApplicationEventMulticaster事件多播器还不会使用Spring监听器的同学,先移步《spring监听器的使用》这篇文章。二、原理Spring使用事件多播器ApplicationEventMulticaster来注册和通知监听器。先来看下刷新Application上下文的原创 2020-05-10 23:03:35 · 2118 阅读 · 3 评论 -
spring源码:注册BeanPostProcessor
一、介绍 BeanPostProcessor接口定义了回调方法,开发者可以实现这些回调方法来提供自定义的实例化逻辑、依赖项解析逻辑等等。BeanPostProcessor也叫Bean后处理器,Spring框架会加载Bean过程中特定的步骤,来调用Bean后处理器中的接口方法,并传入一些值给这些回调方法。具体可参考:spring中常用的BeanPostProcessor、Spring官方文档介绍...原创 2020-05-08 20:14:41 · 544 阅读 · 0 评论 -
spring源码:BeanFactoryPostProcessor原理
一、介绍 Spring IoC容器允许BeanFactoryPostProcessor(即BeanFactory后处理器)读取配置元数据,并能在容器实例化除BeanFactoryPostProcessor实例之外的任何bean之前更改它。 Spring我们可以配置多个BeanFactoryPostProcessor实例,并且可以通过实现Order或PriorityOrdered接口设置or...原创 2020-05-04 16:52:40 · 297 阅读 · 0 评论 -
一文了解spring中常用组件的存储位置
一、BeanFactory先来看下XmlBeanFactory类的关系图(Mac快捷键是:command+option+U)可以看到BeanFactory的具体类只有XmlBeanFactory和DefaultListableBeanFactory,现在XmlBeanFactory已过期,BeanFactory就只剩唯一的实现类DefaultListableBeanFactory了,应该说使...原创 2020-05-03 21:28:06 · 565 阅读 · 1 评论 -
spring中的Aware接口原来是这么回事
一、介绍 使用spring开发的同学,或多或少都使用过形如XxxAware这样的接口。spring文档中是这样解释Aware接口的:Spring提供了广泛的Aware回调接口,让bean向容器表明它们需要某种基础设施依赖。通常Aware有这样一个规则:Aware接口的名称,表示依赖对象的类名称。例如,一个bean需要使用ApplicationContext,实现Application...原创 2020-05-03 19:38:15 · 7880 阅读 · 2 评论 -
spring源码:ApplicationContext初始化概述
一、介绍 ApplicationContext是一个为应用程序提供配置的中央接口。该接口继承了许多spring中常用的接口,源码如下:public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, App...原创 2020-04-20 00:14:59 · 388 阅读 · 0 评论 -
spring中常用的BeanPostProcessor(下)
接着上篇文章继续讲述,本篇主要讲述SmartInstantiationAware和MergedBeanDefinition后处理器的源码解析和使用。在复习下这张类图:1. MergedBeanDefinitionPostProcessor的应用MergedBeanDefinition后处理器处理具备基本的BeanPostProcessor功能,还可以用于修改BeanDefinition,执行...原创 2020-04-12 18:27:23 · 512 阅读 · 0 评论 -
spring中常用的BeanPostProcessor(上)
一、介绍BeanPostProcessor翻译过来叫bean后处理器,是spring提供给用户用来扩展加载bean逻辑的一个接口。spring中加载bean可以粗略的分为四个步骤:创建bean、提前暴露bean、给bean填充属性、调用bean的初始方法BeanPostProcessor中定义了一些接口方法,spring会在加载bean的特定步骤回调这些方法,来执行用户扩展的逻辑。常见的...原创 2020-04-12 13:18:26 · 1391 阅读 · 0 评论 -
spring源码:bean加载之创建bean-初始化bean
一、介绍 我理解的bean加载,是程序从IOC容器获取bean的过程,而创建bean实例只是其中的一个步骤。因为bean实例被创建后,会存入到DefaultSingletonBeanRegistry#singletonObjects缓存中(类型为(ConcurrentHashMap)),程序下次再获取该bean时,就不用再次创建bean实例了。 创建bean实例的方法为:AbstractA...原创 2020-04-05 22:23:28 · 225 阅读 · 0 评论 -
spring源码:bean加载之创建bean-属性填充
一、介绍 提前曝光bean的Object-Factory是spring为了解决bean循环依赖的一种方法。什么是循环依赖spring加载一个bean需要两个步骤:1.创建bean;2.给这个bean填充属性如上图,加载类A的步骤为:先创建A,然后给A填充属性的时候,发现A依赖一个类B属性,所以去加载B;创建B,然后给B填充属性的时候,发现B依赖一个类C属性,所以去加载C;创...原创 2020-04-05 13:00:42 · 310 阅读 · 0 评论 -
spring源码:bean加载之创建bean-提前曝光bean的Object-Factory
一、介绍 我理解的bean加载,是程序从IOC容器获取bean的过程,而创建bean实例只是其中的一个步骤。因为bean实例被创建后,会存入到DefaultSingletonBeanRegistry#singletonObjects缓存中(类型为(ConcurrentHashMap)),程序下次再获取该bean时,就不用再次创建bean实例了。 创建bean实例的方法为:AbstractA...原创 2020-03-30 19:14:22 · 801 阅读 · 0 评论 -
spring源码:bean加载之创建bean-创建BeanWrapper
一、介绍 熟悉spring源码的都知道,一般xxx()方法是来做一些准备、辅助之类的工作,真正干活儿的大部分会有一个与之对应的doXxx()方法。createBean()方法也不例外,真正的创建逻辑在doCreateBean()方法中。在真正创建bean之前,会做一些验证、处理的工作。本章就详细介绍一下,创建bean之前具体都执行了哪些步骤。二、bean加载流程获取用户传入name对应的...原创 2020-03-29 23:07:30 · 381 阅读 · 0 评论 -
spring源码:bean加载之创建bean-概述
一、介绍 我理解的bean加载,是程序从IOC容器获取bean的过程,而创建bean实例只是其中的一个步骤。因为bean实例被创建后,会存入到DefaultSingletonBeanRegistry#singletonObjects缓存中(类型为(ConcurrentHashMap)),程序下次再获取该bean时,就不用再次创建bean实例了。 创建bean实例的方法为:AbstractA...原创 2020-03-22 15:27:30 · 515 阅读 · 0 评论 -
spring源码:bean加载之准备创建bean(createBean()方法)
一、介绍 熟悉spring源码的都知道,一般xxx()方法是来做一些准备、辅助之类的工作,真正干活儿的大部分会有一个doXxx()方法。createBean()方法也不例外,在真正创建bean之前,会做一些验证、处理的工作。本章就详细介绍一下,创建bean之前都执行了哪些步骤?二、bean加载流程获取用户传入name对应的beanName尝试从缓存中获取bean实例缓存中不存在,加载...原创 2020-03-16 21:23:55 · 573 阅读 · 0 评论 -
spring源码:bean加载之获取单例(getSingleton()方法)
一、目的 从spring容器中获取单例时有两种情况:缓存中存在和缓存中不存在。缓存中不存在的情况,调用需要getSingleton()方法来获取单例。本章主要介绍获取单例的整体流程,该逻辑中创建bean步骤较为复杂,放在后面章节单独介绍。二、bean加载流程获取用户传入name对应的beanName尝试从缓存中获取bean实例缓存中不存在,加载bean实例3.1. 检查循环依赖3...原创 2020-03-14 22:20:35 · 1680 阅读 · 0 评论 -
spring源码:bean加载之从bean实例中获取对象(getObjectForBeanInstance)
一、目的 spring管理的bean实例分为两类,一类是实现FactoryBean接口的Bean,一类是其它类型的Bean。getObjectForBeanInstance目的是为了从FactoryBean类型的bean实例中获取正确的bean。二、FactoryBean的使用方法一般类型的bean实例化时,spring通过反射机制利用bean标签中的class属性来实例化一个bean,然...原创 2020-03-11 11:55:13 · 1157 阅读 · 1 评论 -
spring源码:bean加载之从缓存中获取bean
一、目的 单例bean在spring的容器中只会被创建一次,被创建的bean会保存在DefaultSingletonBeanRegistry类的singletonObjects属性中。singletonObjects的类型是一个Map,其中key为bean的id,value为bean实例。目的是为了后面再次用到这个bean的时候,可以直接从singletonObjects获取,无需再重新创建b...原创 2019-11-23 17:22:55 · 495 阅读 · 0 评论 -
spring源码:bean加载之转换对应的beanName
一、目的 加载bean的动作是由getBean()方法来执行的,其中第一步就是转换对应的beanName。其目的有两个:去掉FactoryBean的修饰符;类型的class,spring默认返回的是getObject()方法所返回的实例找到该真实的beanName public <T> T getBean(String name, @Nullable Class<...原创 2019-11-17 11:37:34 · 814 阅读 · 0 评论 -
spring源码:自定义EntityResolver加载xml的验证文件
1原创 2019-08-24 20:43:40 · 675 阅读 · 2 评论 -
spring源码:注册BeanDefinition(xml方式)
一、目的前面讲到spring读取xml文件后,会得到一个Document对象。接下来就要解析Document转换为spring认识的BeanDefinition对象,这个转换的过程即注册BeanDefinition(简称注册bean)。注册BeanDefinition的目的在于,后面spring使用到xml的配置信息时,无需每次都从Document中解析读取,直接从BeanDefinition中...原创 2019-08-25 23:15:38 · 258 阅读 · 0 评论 -
spring源码:加载xml文件
一、目的 这里说的读取xml文件,不单单是把文件读取成InputStream,而是把xml读取后解析到Document对象中。 用过spring的同学都知道,spring的目的之一是为了让管理bean的工作与业务代码分离。管理这些bean需要一些基础的属性信息(如pojo的属性值)和定义信息(如是否单例、作用域),这些信息可以使用spring注解的方式定义,也可以使用spring标签在xm...原创 2019-08-18 21:04:40 · 494 阅读 · 0 评论 -
spring源码:bean标签的解析之创建BeanDefinition
一、BeanDefinition介绍BeanDefinition 是一个接口,在 Spring 中存在六种实现:AnnotatedGenericBeanDefinition:注解beanChildBeanDefinition:子beanConfigurationClassBeanDefinitionReader.ConfigurationClassBeanDefinitionGener...原创 2019-09-08 22:47:31 · 568 阅读 · 0 评论 -
spring源码:bean标签的解析之设置BeanDefinition的属性值
一、目的 BeanDefinition是spring中对bean的一个抽象表示,bean的各种信息在BeanDefinition中都有对应的属性表示。本章分析的内容比较简单,就是在创建BeanDefinition之后,如何给BeanDefinition中的各种属性设置值。二、相关类org.springframework.beans.factory.xml.BeanDefinitionPa...原创 2019-09-10 23:04:22 · 1109 阅读 · 0 评论 -
spring源码:bean标签的解析之简单子元素的解析
一、整体脉络 Spring中每个bean实例,都有一个对应的BeanDefinition实例。这个BeanDefinition实例记录了该bean的各种属性信息,如id、scope等等。先来看一份xml中bean标签的配置 <bean id="person" class="com.kaka.spring.beans.Person"> <property...原创 2019-09-15 23:21:46 · 322 阅读 · 0 评论 -
spring源码:bean标签的解析之constructor-arg子元素的解析
public void parseConstructorArgElements(Element beanEle, BeanDefinition bd) { NodeList nl = beanEle.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i); if...原创 2019-09-30 17:25:39 · 745 阅读 · 0 评论 -
spring源码:注册解析的BeanDefinition
一、介绍 spring在解析xml中的bean标签时,会把该标签的所有信息封装到一个GenericBeanDefinition实例中。然后把该GenericBeanDefinition实例注册到一个beanDefinitionMap 中,供后面复杂的功能使用。二、整体脉络 <bean id="person" class="com.kaka.spring.beans.Person...原创 2019-10-01 22:30:28 · 349 阅读 · 0 评论 -
spring源码:解析xml中的import和alias标签
一、介绍 spring允许xml中有两类标签:默认标签和扩展标签 。默认标签有四种:beans、bean、import、alias ;其中bean标签为最基础的标签,其他三个标签都是围绕bean标签来做封装或者修饰的beans:包含多个bean标签import:表示导入另外一个xml,xml又包含这些标签alias:修饰某个bean的别名扩展标签包括spring的扩展标签...原创 2019-10-02 17:35:54 · 2072 阅读 · 0 评论 -
spring源码:获取xml的验证模式
一、验证方式介绍XML文件的验证模式保证了XML文件的正确性,比较常用的验证模式有两种:DTD和XSD。DTD(Document Type Definition)文档类型定义,是一种XML约束模式语言,是XML文件的验证机制,属于XML文件组成的一部分。一个DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体和符号规则。声明格式如下<?xml versi...原创 2019-08-18 23:21:48 · 284 阅读 · 0 评论