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 容器的具体表现, 需要使用什么样的容器由客户决定
FactoryBean 只是一个可以在 IoC 容器中被管理的一个 Bean, 是对各种处理过程和资源使用的抽象, FactoryBean 在需要时产生另一个对象, 而不返回自身, 可以看作为一个抽象工厂.
5. 最终生产的 Bean 存在在 FactoryBeanRegistrySupport.java 中, 是一个 concurrentHashMap
使用 Put 方法存入
他的 Key 是 beanName + "#"+ 使用次数
下面说下 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 (最上层)
来源: http://www.bubuko.com/infodetail-3001109.html