---2.2 spring之IOC源码深入理解
文章平均质量分 69
小师兄.
语言学习开发路上的一个初学者。
展开
-
spring深入学习(二)IOC 之 Spring 统一资源加载策略(本系列均为转载,记录个人学习,便于二次学习)
在学 Java SE 的时候我们学习了一个标准类 java.net.URL,该类在 Java SE 中的定位为统一资源定位器(Uniform Resource Locator),但是我们知道它的实现基本只限于网络形式发布的资源的查找和定位。然而,实际上资源的定义比较广泛,除了网络形式的资源,还有以二进制形式存在的、以文件形式存在的、以字节流形式存在的等等。而且它可以存在于任何场所,比如网络、文件系...转载 2018-11-13 10:21:01 · 309 阅读 · 0 评论 -
spring深入学习(十六) IOC 之parentBeanFactory 与依赖处理
继上篇博客 【死磕 Spring】—– 加载 bean 之 缓存中获取单例 bean,如果从单例缓存中没有获取到单例 bean,则说明两种情况:该 bean 的 scope 不是 singleton 该 bean 的 scope 是 singleton ,但是没有初始化完成针对这两种情况 Spring 是如何处理的呢?统一加载并完成初始化!这部分内容的篇幅较长,拆分为两部分,第一部分主要是...转载 2018-12-05 14:08:18 · 3525 阅读 · 1 评论 -
spring深入学习(十七) IOC 之分析各 scope 的 bean 创建
在 Spring 中存在着不同的 scope,默认是 singleton ,还有 prototype、request 等等其他的 scope,他们的初始化步骤是怎样的呢?这个答案在这篇博客中给出。singletonSpring 的 scope 默认为 singleton,其初始化的代码如下: if (mbd.isSingleton()) { ...转载 2018-12-05 14:16:57 · 188 阅读 · 0 评论 -
spring深入学习(十八) IOC 之开启 bean 的实例化进程
在上篇博客【死磕 Spring】—– 加载 bean 之 分析各 scope 的 bean 创建中有一个核心方法没有讲到 createBean(),该方法的如下:protected abstract Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) t...转载 2018-12-06 13:48:22 · 288 阅读 · 0 评论 -
spring深入学习(十九) IOC 之 Factory 实例化 bean
这篇我们关注创建 bean 过程中的第一个步骤:实例化 bean,对应的方法为:createBeanInstance(),如下: protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) { // 解析 bean,将 ...转载 2018-12-07 09:59:10 · 3645 阅读 · 0 评论 -
spring深入学习(二十) IOC 之构造函数实例化 bean
createBeanInstance() 用于实例化 bean,它会根据不同情况选择不同的实例化策略来完成 bean 的初始化,主要包括:Supplier 回调:obtainFromSupplier() 工厂方法初始化:instantiateUsingFactoryMethod() 构造函数自动注入初始化:autowireConstructor() 默认构造函数注入:instantiat...转载 2018-12-10 10:57:01 · 622 阅读 · 0 评论 -
spring深入学习(二十一) IOC 之 属性填充
doCreateBean() 主要用于完成 bean 的创建和初始化工作,我们可以将其分为四个过程:createBeanInstance() 实例化 bean populateBean() 属性填充 循环依赖的处理 initializeBean() 初始化 bean第一个过程实例化 bean 已经在前面两篇博客分析完毕了,这篇博客开始分析 属性填充,也就是 populateBean()...转载 2018-12-10 11:33:56 · 528 阅读 · 0 评论 -
spring深入学习(二十四) IOC 之 深入分析 Aware 接口
doCreateBean() 方法主要干三件事情:实例化 bean 对象:createBeanInstance() 属性注入:populateBean() 初始化 bean 对象:initializeBean()而初始化 bean 对象时也是干了三件事情:激活 Aware 方法 后置处理器的应用 激活自定义的 init 方法接下来三篇文章将会详细分析这三件事情,这篇主要分析 A...转载 2018-12-16 14:38:42 · 343 阅读 · 0 评论 -
spring深入学习(二十五)IOC 之 深入分析 BeanPostProcessor
Spring 作为优秀的开源框架,它为我们提供了丰富的可扩展点,除了前面提到的 Aware 接口,还包括其他部分,其中一个很重要的就是 BeanPostProcessor。这篇文章主要介绍 BeanPostProcessor 的使用以及其实现原理。我们先看 BeanPostProcessor 的定位:BeanPostProcessor 的作用:在 Bean 完成实例化后,如果我们需要对其进行...转载 2018-12-16 14:52:51 · 253 阅读 · 0 评论 -
spring深入学习(二十六)IOC 之 深入分析 InitializingBean 和 init-method
Spring 在 bean 初始化时进行三个检测扩展,也就是说我们可以对 bean 进行三个不同的定制化处理,前面两篇博客 【死磕 Spring】—– IOC 之 深入分析 Aware 接口 和 【死磕 Spring】—– IOC 之 深入分析 BeanPostProcessor 已经分析了 Aware 接口族 和 BeanPostProcessor 接口,这篇分析 InitializingBea...转载 2018-12-16 15:04:33 · 516 阅读 · 0 评论 -
spring深入学习(二十七)IOC 之 深入分析 BeanFactoryPostProcessor
在博客 【死磕 Spring】—– IOC 之 深入分析 BeanPostProcessor 深入介绍了 BeanPostProcessor 的实现机制。在这篇文章中提到 BeanPostProcessor 是 Spring 提供一种扩展机制,该机制允许我们在 Bean 实例化之后初始化之际对 Bean 进行增强处理(前、后置处理)。同样在 Spring 容器启动阶段,Spring 也提供了一种容...转载 2018-12-16 15:05:46 · 199 阅读 · 0 评论 -
spring深入学习(二十二) IOC 之循环依赖处理
这篇分析 doCreateBean() 第三个过程:循环依赖处理。其实循环依赖并不仅仅只是在 doCreateBean() 中处理,其实在整个加载 bean 的过程中都有涉及,所以下篇内容并不仅仅只局限于 doCreateBean(),而是从整个 Bean 的加载过程进行分析。什么是循环依赖循环依赖其实就是循环引用,就是两个或者两个以上的 bean 互相引用对方,最终形成一个闭环,如 A ...转载 2018-12-11 13:45:02 · 242 阅读 · 0 评论 -
spring深入学习(十五) IOC 之从单例缓存中获取单例 bean
从这篇博客开始我们开始加载 bean 的第一个步骤,从缓存中获取 bean,代码片段如下: Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { if (logger.isDebugEnab...转载 2018-12-05 13:47:00 · 442 阅读 · 0 评论 -
spring深入学习(八)IOC 之解析 bean 标签:meta、lookup-method、replace-method
BeanDefinition中已经完成了对 Bean 标签属性的解析工作,这篇博文开始分析子元素的解析。完成 Bean 标签基本属性解析后,会依次调用 parseMetaElements()、parseLookupOverrideSubElements()、parseReplacedMethodSubElements() 对子元素 meta、lookup-method、replace-method...转载 2018-11-28 18:31:13 · 535 阅读 · 0 评论 -
spring深入学习(七)IOC 之解析 bean 标签:BeanDefinition
解析 bean 标签的过程其实就是构造一个 BeanDefinition 对象的过程,<bean> 元素标签拥有的配置属性,BeanDefinition 均提供了相应的属性,与之一一对应。所以我们有必要对 BeanDefinition 有一个整体的认识。BeanDefinitionBeanDefinition 是一个接口,它描述了一个 Bean 实例,包括属性值、构造方法值和继...转载 2018-11-28 11:44:05 · 210 阅读 · 1 评论 -
spring深入学习(三)IOC 之 加载 Bean
先看一段熟悉的代码:ClassPathResource resource = new ClassPathResource("bean.xml");DefaultListableBeanFactory factory = new DefaultListableBeanFactory();XmlBeanDefinitionReader reader = new XmlBeanDefiniti...转载 2018-11-14 09:38:12 · 184 阅读 · 0 评论 -
spring深入学习(四)IOC 之 获取验证模型
调用 getValidationModeForResource() 获取 xml 文件的验证模式 调用 loadDocument() 根据 xml 文件获取相应的 Document 实例。 调用 registerBeanDefinitions() 注册 Bean 实例。这篇博客主要分析获取 xml 文件的验证模式。XML 文件的验证模式保证了 XML 文件的正确性DTD 与 XS...转载 2018-11-14 09:56:37 · 271 阅读 · 0 评论 -
spring深入学习(一)深入理解 Spring IOC
1、IOC理论IOC英文缩写:Inversion of control, 另一个缩写为DI:依赖注入(Denpency Injection) 用作控制反转 理解:spring IOC就是负责对象生命周期和对象之间的关系以找女朋友为例子:一般情况下我们是如何来找女朋友的呢?首先我们需要根据自己的需求(漂亮、身材好、性格好)找一个妹子,然后到处打听她的兴趣爱好、微信、电话号码,然后各种投...原创 2018-11-12 13:30:53 · 1068 阅读 · 0 评论 -
spring深入学习(九)IOC 之解析 bean 标签:constructor-arg、property 子元素
这篇博客分析 constructor-arg 、property、qualifier 三个子元素。constructor-arg 子元素举个小栗子:public class StudentService { private String name; private Integer age; private BookService bookService...转载 2018-11-29 09:15:38 · 562 阅读 · 0 评论 -
spring深入学习(十) IOC 之解析 bean 标签:解析自定义标签
前面四篇文章都是分析 Bean 默认标签的解析过程,包括基本属性、六个子元素(meta、lookup-method、replaced-method、constructor-arg、property、qualifier),涉及内容较多,拆分成了四篇文章,导致我们已经忘记从哪里出发的了,勿忘初心。总图: processBeanDefinition() 负责 Bean 标签的解析,在解析...转载 2018-11-29 09:45:21 · 503 阅读 · 0 评论 -
spring深入学习(十一)IOC 之解析自定义标签
在分析自定义标签的解析之前,我们有必要了解自定义标签的使用。使用自定义标签扩展 Spring 自定义标签配置一般需要以下几个步骤:创建一个需要扩展的组件 定义一个 XSD 文件,用于描述组件内容 创建一个实现 AbstractSingleBeanDefinitionParser 接口的类,用来解析 XSD 文件中的定义和组件定义 创建一个 Handler,继承 Namespace...转载 2018-11-29 10:23:00 · 235 阅读 · 0 评论 -
spring深入学习(十二)IOC 之注册解析的 BeanDefinition
DefaultBeanDefinitionDocumentReader.processBeanDefinition() 完成 Bean 标签解析的核心工作,如下: protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) { BeanDefinitio...转载 2018-11-29 10:52:48 · 391 阅读 · 0 评论 -
spring深入学习(十三)IOC 之 IOC 初始化总结
在前文提过,IOC 容器的初始化过程分为三步骤:Resource 定位、BeanDefinition 的载入和解析,BeanDefinition 注册。Resource 定位。我们一般用外部资源来描述 Bean 对象,所以在初始化 IOC 容器的第一步就是需要定位这个外部资源。 BeanDefinition 的载入和解析。装载就是 BeanDefinition 的载入。BeanDefin...转载 2018-11-30 10:00:04 · 208 阅读 · 0 评论 -
spring深入学习(十四) IOC 之开启 bean 的加载
(此图来自《Spring 揭秘》)Spring IOC 容器所起的作用如上图所示,它会以某种方式加载 Configuration Metadata,将其解析注册到容器内部,然后回根据这些信息绑定整个系统的对象,最终组装成一个可用的基于轻量级容器的应用系统。Spring 在实现上述功能中,将整个流程分为两个阶段:容器初始化阶段和加载bean 阶段。容器初始化阶段:首先通过某种方式加载...转载 2018-11-30 10:20:38 · 236 阅读 · 0 评论 -
spring深入学习(五) IOC 之解析Bean:解析 import 标签
Spring 中有两种解析 Bean 的方式。如果根节点或者子节点采用默认命名空间的话,则调用 parseDefaultElement() 进行默认标签解析,否则调用 delegate.parseCustomElement() 方法进行自定义解析。所以以下博客就这两个方法进行详细分析说明,先从默认标签解析过程开始,源码如下: private void parseDefaultEleme...转载 2018-11-28 10:37:46 · 175 阅读 · 0 评论 -
spring深入学习(六) IOC 之解析 bean 标签:开启解析进程
import 标签解析完毕了,再看 Spring 中最复杂也是最重要的标签 bean 标签的解析过程。在方法 parseDefaultElement() 中,如果遇到标签 为 bean 则调用 processBeanDefinition() 方法进行 bean 标签解析,如下: protected void processBeanDefinition(Element ele, Be...转载 2018-11-28 10:43:04 · 141 阅读 · 0 评论 -
spring深入学习(二十三) IOC 之 bean 的初始化
一个 bean 经历了 createBeanInstance() 被创建出来,然后又经过一番属性注入,依赖处理,历经千辛万苦,千锤百炼,终于有点儿 bean 实例的样子,能堪大任了,只需要经历最后一步就破茧成蝶了。这最后一步就是初始化,也就是 initializeBean(),所以这篇文章我们分析 doCreateBean() 中最后一步:初始化 bean。 protected Obj...转载 2018-12-11 17:21:34 · 198 阅读 · 0 评论