Spring框架系列(四)--IOC控制反转和DI依赖注入

背景:

  如果对象的引用或者依赖关系的管理由具体对象完成,代码的耦合性就会很高,代码测试也变得困难。而IOC可以很好的解决这个问题,把

依赖关系交给框架或者IOC容器进行管理,简化了开发。

  IOC是一种设计模式,而Spring IOC是其一种实现。Spring IOC提供一个基本的JavaBean容器,通过IOC模式管理依赖关系。

IOC(Inversion of Control)两种实现:

  1、DL(Dependency Lookup),已经被淘汰,需要用户自己去查找资源和组装对象,有了侵入性

  2、DI(Dependency Injection),负责组件的装配

Spring的IOC支持的功能:

  1、依赖注入

  2、依赖检查

  3、自动装配

  4、支持集合

  5、指定初始化方法和销毁方法

  6、支持回调某些方法(需要实现Spring接口,略有侵入性)

最重要是依赖注入,从XML读取ref标签,ref就是runtimeBeanReference

 

IOC容器主要分为两种具体表现形式:

  1、BeanFactory接口:简单容器。只是实现了最基本的功能,可以理解为hashmap,key是BeanName,value是bean instance

  2、ApplicationContext接口:高级容器。在简单容器的基础上,集成很多接口,代表整个容器的所有功能。定义了refresh(),刷新整个容

器,重新加载/刷新所有的bean

除了这两种,还有其他的辅助接口

ApplicationContext作为高级容器依赖低级容器的getBean(),ClassPathXmlApplicationContext的构建过程是IOC的初始化

流程:

1、用户构造ClassPathXmlApplicationContext(简称 CPAC)

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

低级容器加载所有BeanDefinition和Properties到容器中。

  低级容器加载成功后,高级容器开始处理一些回调,例如Bean后置处理器。回调setBeanFactory法。或者注册监听器等,发布事件,实例化例

Bean等等功能。

简单说就是:

  1、低级容器加载配置文件(从 XML,数据库,Applet),并解析成 BeanDefinition 到低级容器中。

  2、加载成功后,高级容器启动高级功能,例如接口回调,监听器,自动实例化单例,发布事件等等功能。

加载所有的Bean配置成BeanDefinition到容器中,如果Bean有依赖关系,则使用占位符暂时代替。

然后,在调用getBean的时候,进行真正的依赖注入,即如果碰到了属性是ref的(占位符),那么就从容器里获取这个Bean,然后注入到实例中

—— 这就是依赖注入

依赖注入方式:

setter、constructor、factory、@Autowired等实现

请自行百度或者参考我之前的文章:https://www.cnblogs.com/huigelaile/p/10973913.html

 

想要深入了解可以查看《Spring技术内幕》一书第二章,或者IOC相关源码

内容参考:http://thinkinjava.cn

posted @ 2019-06-05 11:13  Diamond-Shine  阅读(354)  评论(0编辑  收藏  举报