Spring中的IOC_源码_随笔
Spring ioc 叫控制反转,也就是把创建Bean的动作交给Spring去完成。
spring ioc 流程大致为 定位-> 加载->注册
先说几个比较有意思的点
1.Spring中的通过IOC生成的Bean是存放在ConcurrentHashMap中的

2.通过xml配置SpringBean时,spring会通过dom解析的方式解析xml

3.ioc中使用了大量的委派模式,代理模式,单例模式,工厂模式,模板模式,原型模式,导致源码。。。阅读极其困难。
4.BeanFactory和FactoryBean
BeanFactory是指IOC容器编程抽象,比如ApplicationContext,xmlBeanFactory等,都是IOC容器的具体表现,需要使用什么样的容器由客户决定。bean工厂,是一个工厂,spring ioc的最顶层接口就是这个BeanFactory,它的作用是管理Bean,即实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。
FactoryBean只是一个可以在IOC容器中被管理的一个Bean,是对各种处理过程和资源使用的抽象,FactoryBean在需要时产生另一个对象,而不返回自身,可以看作为一个抽象工厂。工厂Bean,是一个Bean,作用是产生其他Bean实例。通常情况下,Bean无须自己实现工厂模式,spring容器担任工厂角色,但少数情况下,容器中的bean本身就是工厂,其他工厂是产生其他bean实例。
5.最终生产的Bean存在在FactoryBeanRegistrySupport.java中,是一个concurrentHashMap

使用Put方法存入

他的Key是 beanName + "#"+ 使用次数

依赖注入的流程
1.读取BeanDefinition中信息,获取其依赖关系
2.实例化
下面说下IOC的基本步骤
1.初始化的入口在容器的实现中通过refresh()来实现
2.加载Bean进入IOC容器使用的是loadBeanDefinition
大致过程如下:
2.1 ResourceLoader进行资源定位(默认DefaultResourceLoader),同时上下文本身给出了ResourceLoader的实现,可以从类路径,文件系统,URL等方式定位资源。
2.2 比如是使用xmlBeanFacotry作为IOC容器,需要为它指定bean定义的资源,也就是bean定义文件时通过抽象成Resource来被IOC处理,容器通过BeanDefinitionReader来定义信息的解析和Bean信息的注册,通常使用XmlBeanDefinitionReader来解析bean的xml定义文件--委派给BeanDefinitionParserDelegate来实际处理从而得到Bean的定义信息
2.3使用LoadBeanDefinition,RegisterBeanDefinition这些方法来处理BeanDefinition服务,容器解析得到BeanDefinitionIoc以后,需要把它在IOC容器中注册,这是由IOC实现BeanDefinitRegistry实现的。注册过程就是IOC容器内部维护一个HashMap来保存得到的BeanDefinition。
3.我们通过BeanFactory和ApplicationContex来享受IOC服务。
我们来打开一份spring源码,来看看继承关系
ClassPathXmlApplicationContext- AbstractXmlApplicationContext - AbstractRefreshableConfigApplicationContext - AbstractRefreshableApplicationContext - AbstractApplicationContext - DefaultResourceLoader / ConfigurableApplicationContext - ApplicationContext - ListableBeanFactory / HierarchicalBeanFactory -BeanFactory (最上层)
补充
IOC的代理方式
如果被代理的类实现了一个接口,那么默认使用JDK代理
如果没有实现任何接口,那么默认使用cglib
Spring中的IOC_源码_随笔的更多相关文章
- Spring中Bean命名源码分析
Spring中Bean命名源码分析 一.案例代码 首先是demo的整体结构 其次是各个部分的代码,代码本身比较简单,不是我们关注的重点 配置类 /** * @Author Helius * @Crea ...
- Spring中AOP相关源码解析
前言 在Spring中AOP是我们使用的非常频繁的一个特性.通过AOP我们可以补足一些面向对象编程中不足或难以实现的部分. AOP 前置理论 首先在学习源码之前我们需要了解关于AOP的相关概念如切点切 ...
- spring源码_下载以及转入eclipse (2016-11-08)
本例spring源码版本是4.3.0的, 所以jdk需要准备1.8的(不同版本源码要求的jdk不一样) 1.8版本myeclipse10无编译环境,只有运行环境,出现点问题,下载最新版本的Eclips ...
- 探秘Tomcat(一)——Myeclipse中导入Tomcat源码
前言:有的时候自己不知道自己是井底之蛙,这并没有什么可怕的,因为你只要蜷缩在方寸之间的井里,无数次的生活轨迹无非最终归结还是一个圆形:但是可怕的是有一天你不得不从井里跳出来生活,需要重新审视井以外的生 ...
- Scala 深入浅出实战经典 第60讲:Scala中隐式参数实战详解以及在Spark中的应用源码解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- 【Spring】Spring IOC原理及源码解析之scope=request、session
一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存 ...
- spring boot 2.0 源码分析(一)
在学习spring boot 2.0源码之前,我们先利用spring initializr快速地创建一个基本的简单的示例: 1.先从创建示例中的main函数开始读起: package com.exam ...
- Spring JPA实现逻辑源码分析总结
1.SharedEntityManagerCreator: entitymanager的创建入口 该类被EntityManagerBeanDefinitionRegistrarPostProcesso ...
- spring boot 2.0 源码分析(二)
在上一章学习了spring boot 2.0启动的大概流程以后,今天我们来深挖一下SpringApplication实例变量的run函数. 先把这段run函数的代码贴出来: /** * Run the ...
随机推荐
- Cocos动作执行时,同时执行完毕再进行下一步的方式
在js中,runAction是统一保存起来等单个文件运行完了再统一进行回调运行的,所以如果想在动作执行完毕之后调用某个函数,那这个函数就应该存在于回调函数中,不会就不能同步了
- Mac安装nginx配置过程
mac电脑系统重装了,记录一下安装nginx的过程: 1.打开终端 2.安装Command Line tools xcode-select --install 3.安装brew命令 ruby -e & ...
- Paxos协议超级详细解释+简单实例
转载自: https://blog.csdn.net/cnh294141800/article/details/53768464 Paxos协议超级详细解释+简单实例 Basic-Paxos算法 ...
- H5唤醒app,第三方开源库
在微信浏览器内,安卓打开应用宝,ios跳进appstore,基本都可以成功在外部浏览器内,已安装可进入应用内,未安装进入应用宝提示下载,需客户端支持.<!DOCTYPE html> < ...
- Burnside引理和Polya定理之间的联系
最近,研究了两天的Burnside引理和Polya定理之间的联系,百思不得其解,然后直到遇到下面的问题: 对颜色限制的染色 例:对正五边形的三个顶点着红色,对其余的两个顶点着蓝色,问有多少种非等价的着 ...
- BZOJ.5305.[HAOI2018]苹果树(组合 计数)
LOJ BZOJ 洛谷 BZOJ上除了0ms的Rank1啦.明明这题常数很好优化的. 首先,\(n=1\)时有\(2\)个位置放叶子,\(n=2\)时有\(3\)个... 可知\(n\)个点的有标号二 ...
- npm install命令详解
-S,–save 安装包信息将加到dependencies(生产阶段的依赖) npm install --save 或 npm install -S -D, –save-dev 安装包信息将加到dev ...
- Scala语言笔记 - 第一篇
目录 Scala语言笔记 - 第一篇 1 基本类型和循环的使用 2 String相关 3 模式匹配相关 4 class相关 5 函数调用相关 Scala语言笔记 - 第一篇 最近研究了下scala ...
- 有关promise的技巧
其实promise的作用是将异步的代码转化为同步,这里的异步指的是request1,request2.
- 在Linux上要安装SSH协议
学习准备:博客园.CSDN.51CTO,注意问问题去CSDN.注意还有一种就是自己搭建博客,自己搭建博客相当于写一个网站:http://pyshell.cn;github:是一个代码仓库是别人的.有些 ...