理解Spring中的IOC

IOC

  • IOC即inversion of control控制反转,创建对象由以前的程序员自己new 构造方法来调用,变成了交由Spring创建对象
    两种实现方法 依赖查找(DL) 和 依赖注入(DI)
    理解Spring中的IOC
  • DL已经被抛弃,因为他需要用户自己使用API查找资源和使用对象,有侵入性
  • DI是Spring使用的方式, 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可

Spring 的 IoC

依赖注入,从 XML 的配置上说, 即 ref 标签。对应 Spring 中的RuntimeBeanReference 对象。

Spring 作者 Rod Johnson 设计了两个接口用以表示容器。

  • BeanFactory:可以理解为就是个 HashMap,Key 是 BeanName,Value 是 Bean 实例。低级容器
  • ApplicationContext: 该接口定义了一个 refresh 方法,此方法是所有阅读 Spring 源码的人的最熟悉的方法,用于刷新整个容器,即重新加载/刷新所有的 bean。高级容器
    理解Spring中的IOC
    理解Spring中的IOC
    注意,这里为了理解方便,有所简化。

这里再用文字来描述这个过程:

用户构造 ClassPathXmlApplicationContext(简称 CPAC)

CPAC 首先访问了 “抽象高级容器” 的 final 的 refresh 方法,这个方法是模板方法。所以要回调子类(低级容器)的 refreshBeanFactory 方法,这个方法的作用是使用低级容器加载所有 BeanDefinition 和 Properties 到容器中。

低级容器加载成功后,高级容器开始处理一些回调,例如 Bean 后置处理器。回调 setBeanFactory 方法。或者注册监听器等,发布事件,实例化单例 Bean 等等功能,这些功能,随着 Spring 的不断升级,功能越来越多,很多人在这里迷失了方向 :)。

简单说就是:

1.低级容器 加载配置文件(从 XML,数据库,Applet),并解析成 BeanDefinition 到低级容器中。
2、加载成功后,高级容器启动高级功能,例如接口回调,监听器,自动实例化单例,发布事件等等功能。
所以,一定要把 “低级容器” 和“高级容器” 的区别弄清楚。不能一叶障目不见泰山。

参考自 https://www.jianshu.com/p/17b66e6390fd
作者:莫那一鲁道
链接:https://www.jianshu.com/p/17b66e6390fd
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。