博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从源码看Spring中IOC容器的实现(一):接口体系
阅读量:5867 次
发布时间:2019-06-19

本文共 1568 字,大约阅读时间需要 5 分钟。

IOC的概念:依赖注入与控制反转

为什么需要IOC容器:

如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合以及可测试性的降低.因此,通过将对象的依赖关系交给IOC容器完成从而降低对象之间的耦合.

Spring中IOC容器的实现

Spring的IOC容器有两条主线:BeanFactoryApplicationContext:

  • BeanFactory:简单容器系列,只实现IOC容器的基本功能
  • ApplicationContext:容器的高级形态,在BeanFactory的基础上,增加了许多面向框架的特性,并对应用环境做了适配.

BeanFactory与ApplicationContext接口体系

话不多说,直接上图:

上图分别是BeanFactory和ApplicationContext的接口体系,在每个接口(或抽象类,实现类)旁都标注了该类的作用

是不是看不过来?没关系,我们慢慢分析.

IOC容器的设计主线

BeanFactory作为一个最基本的接口类出现在Spring的IOC容器体系中,为IOC容器的具体实现制定基本的功能规范,体现了Spring为提供给用户使用的IOC容器所设定的最基本的功能规范。包括Bean的获取以及一些类型判断等功能.

  • 从BeanFactory的类继承图中来看其基本功能的定义,在IOC容器的设计中包括两条设计主线:

1. BeanFactory设计路径

从接口BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory,是一条主要的BeanFactory设计路径。

在这条设计路径中,BeanFactory接口定义了基本的IOC容器的规范,包括了getBean()这样的IOC容器的基本方法。而HierarchicalBeanFactory接口在继承了BeanFactory的基本接口之后,增加了getParentBeanFactory(),使BeanFactory具备了双亲IOC容器的管理功能。在ConfigurableBeanFactory中主要定义对BeanFactory的配置功能,比如设置双亲容器,配置Bean后置处理器等。通过这些接口设计的叠加,定义了BeanFactory就是简单IOC容器的基本功能。

这里涉及的是主要接口关系,而具体的IOC容器都是在这个接口体系下实现的,比如我们熟知的DefaultListableBeanFactory,这个基本IOC容器的实现就是实现了ConfigurableBeanFactory,从而成为一个简单IOC容器的实现。

2. ApplicationContext为核心的接口设计

第二条设计主线,是以ApplicationContext为核心的接口设计。

BeanFactory--》ListableBeanFactory--》ApplicationContext--》ConfigurableApplicationContext.

在这个接口体系中,ListableBeanFactory和HierarchicalBeanFactory两个接口连接Beanfactory定义和ApplicationContext定义。

在ListableBeanFactory中,细化了许多BeanFactory的接口功能。而ApplicationContext通过继承MessageSource、ResourceLoader、ApplicationEventPublisher接口,在BeanFactory简单容器的基础上添加了许多对高级容器的特性的支持。

转载于:https://juejin.im/post/5cc56eb8f265da03ae74cc91

你可能感兴趣的文章
电子政务领域的大数据解决思路+-+v1.2-胡书能
查看>>
Two Tables in ScrollView
查看>>
InAppSettingsKit
查看>>
eclipse 整合svn zip包下载地址
查看>>
选择SSL加密证书颁发公司的注意事项
查看>>
【JDK 8特性】让代码更优雅之List排序
查看>>
【CF 应用开发大赛】ChiShaY美食分享LBS
查看>>
产品经理技能树之 渠道运营
查看>>
Ionic build android, Error: spawn EACCES
查看>>
一个表单 两个提交按钮
查看>>
Freenas使用小结(二)配置(打造nas下载机)
查看>>
Changing Your Commit Messages
查看>>
java.lang.IncompatibleClassChangeError
查看>>
CSS3学习资料
查看>>
cocos官网例子
查看>>
python list extend(扩展) append(添加)
查看>>
如何降低android应用程序的耗电量
查看>>
php 正则匹配中文 utf8编码/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$
查看>>
MySQL查看和修改表的存储引擎
查看>>
iframe子页面调用父页面隐藏域的值
查看>>