1、依赖反转模式

依赖反转:高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口。抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。

在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。

应用依赖反转原则同样被认为是应用了适配器模式,例如:高层的类定义了它自己的适配器接口(高层类所依赖的抽象接口)。被适配的对象同样依赖于适配器接口的抽象(这是当然的,因为它实现了这个接口),同时它的实现则可以使用它自身所在低层模块的代码。通过这种方式,高层组件则不依赖于低层组件,因为它(高层组件)仅间接的通过调用适配器接口多态方法使用了低层组件,而这些多态方法则是由被适配对象以及它的低层模块所实现的。

在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。

Spring中实现依赖反转是通过IOC容器实现的,在对象生成或者初始化的时候,将数据注入到对象中,也可以通过对象引用注入到对象数据域中来注入对方法调的依赖。

2、Spring IOC的应用场景

Spring IOC的注入方式:依赖注入、Setter注入、构造器注入,其中Setter注入是最常用的注入方式。

为了防止注入异常,Spring IOC提供了特定的依赖的检查。

3、Spring IOC的设计和具体实现

BeanFactory:实现简单容器接口。

ApplicationContext:应用上下文。

Spring IOC容器概况:

其中BeanFactory是最基本的IOC 容器的功能规范。

在Spring提供的最基本的ioC 容器的接口定义和实现的基础上,Spring通过定义BeanDefinition来管理基于Spring应用中的各种对象以及他们之间的依赖关系。

对于IOC容器来说,BeanDefinition就是对依赖反转模式中管理的对象依赖关系的数据抽象,也是容器实现依赖反转功能的核心数据结构,依赖反转都是围绕BeanDefinition来处理的。

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

这条接口设计路劲中,BeanFactory接口定义了基本的IOC容器规范。在这个接口定义中,BeanFactory包括了getBean()这样的IOc容器的基本方法(通过这个方法可以从容器中获取BEAN)。而HiearerchialBeanFactory接口在继承了BeanFactory的基本接口之后,增加了getParentBeanFactory()的接口功能,使得BeanFactory具备了双亲IOc容器的管理功能。

ConfigurableBeanFactory主要定义了对BeanFactory的配置功能,比如setParentBeanFactory()设置双亲IOC容器,通过addBeanPostProcessor()配置Bean的后置处理器等。

通过这些接口设计的叠加,定义了BeanFactory就是简单的IOC容器的基本功能。

2.第二条设计主线是:以ApplicationContext应用上下文接口为核心的接口设计。

这里涉及的主要设计接口有,从BeanFactory到ListableBeanFactory,再到ApplicationContext,再到常用的WebApplicationContext或者ConfigurableApplicationContext接口。项目中常用的应用上下文基本都是ConfigurableApplicationContext或者WebApplicationContext的实现。

在这个接口体系中,ListableBeanFactory和HiearerchialBeanFactory俩个接口,连接BeanFactory接口定义和applicationContext应用上下文接口定义。

ListableBeanFactory接口中,细化了许多BeanFactory的接口功能,比如定义了setBeanDefinitionNames接口方法;

对于ApplicationContext接口,它通过继承了MessageSource、ResourceLoader、ApplicationEventPublisher接口,在BeanFactory简单Ioc容器的基础上添加了许多对高级容器的特性的支持。

3.图中涉及的是主要的接口关系,而具体的Ioc容器都是在这个接口体系下实现的,比如DefaultListableBeanFactory,这个基本Ioc容器的实现就是实现了ConfigurableBeanFactory,从而成为了一个简单Ioc容器的实现。像其他的Ioc容器,比如XMLBeanFactory,都是在DefaultListableBeanFactory的基础上做扩展。同样,ApplicationContext的实现也是如此。

4.这个接口系统是以BeanFactory和ApplicationContext为核心的,而BeanFactory又是Ioc容器的最基本的接口,在ApplicationContext的设计中,一方面,可以看到他继承了HiearerchialBeanFactory等BeanFactory的接口,具备了BeanFactory Ioc容器的基本功能,另外一方面,通过继承MessageSource、ResourceLoader、ApplicationEventPublisher这些接口,BeanFactory为ApplicationContext赋予了更高级的Ioc容器特性。对于ApplicationContext而言,为了在Web环境中使用它,还设计了WebApplicationContext接口,而这个接口通过继承ThemeSource接口来扩充功能。(1、2、3、4具为copy,理解有点困哪啊!!)

Spring学习(二)--Spring的IOC的更多相关文章

  1. Spring学习(十一)-----Spring使用@Required注解依赖检查

    Spring学习(九)-----Spring依赖检查 bean 配置文件用于确定的特定类型(基本,集合或对象)的所有属性被设置.在大多数情况下,你只需要确保特定属性已经设置但不是所有属性.. 对于这种 ...

  2. Spring学习(六)-----Spring使用@Autowired注解自动装配

    Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...

  3. Spring学习二----------IOC及Bean容器

    © 版权声明:本文为博主原创文章,转载请注明出处 接口 用于沟通的中介物的抽象化 实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的 ...

  4. spring学习(二) ———— AOP之AspectJ框架的使用

    前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...

  5. Spring学习(一):理解IoC容器

    序言 记得刚毕业那会儿,出来招工作被问到Spring的核心时,都觉得简单的一笔,直接说不就是IoC(控制反转)和DI(依赖注入)么,然后省略一万字对两个名词的解释.最近空来整理了一下Spring中Io ...

  6. Spring学习(一)IOC

     Spring是一站式框架: (1)Spring在javaee三层结构中,每一层都提供不同的解决技术. web层:SpringMVC service层:Spring的Ioc dao层:Spring的J ...

  7. Spring学习二:Spring Bean 定义

    Bean 定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象.这些 bean 是 ...

  8. spring学习(三) ———— spring事务操作

    前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTem ...

  9. Spring学习2—Spring容器

    一.Spring容器接口关系 容器是Spring框架的核心,Spring容器就是一个巨大的工厂.Spring容器使用Ioc(控制反转(Inversion of Control )管理所有组成应用系统的 ...

  10. Spring学习笔记--Spring配置文件和依赖注入

    Spring配置文件 1.alias:设置别名,为bean设置别名,并且可以设置多个别名; <!-- 设置别名 --> <alias name="user" al ...

随机推荐

  1. .NET - Task.Run vs Task.Factory.StartNew

    翻译自 Stephen Toub 2011年10月24日的博文<Task.Run vs Task.Factory.StartNew>,Stephen Toub 是微软并行计算平台团队的首席 ...

  2. 创建human用户登录数据库创建表

    根据人力资源管理系统中表的设计,创建human用户登录数据库创建 准备阶段 把运行脚本复制到D:\app\Administrator\product\11.2.0\dbhome_1\demo\sche ...

  3. python安装wordcloud库报错

    pip install wordcloud 安装成了这样 红彤彤的一片 解决方法 https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 下载对应版 ...

  4. Labview学习之路(七)for和while的理论要点

    for循环 循环次数可以为0(N的接线端为) 终止条件:1. 完成N次循环.      2. 添加条件接线端,就像while循环的红点一样,(方法,右键点击边框,添加条件接线端) 数组通过自动索引接入 ...

  5. Data Vault玩转数据仓库(三)

    在Data Vault 2.0版本里,其不只是针对数据仓库的建模,同时也包含了架构,方法论以及实现.这篇挑几个概念,附上我个人对其的理解.同时也把这个系列的名字改成<Data Vault玩转数据 ...

  6. Unity3d启动事件 - InitializeOnLoad

    监听Unity3d启动事件 - InitializeOnLoad http://blog.csdn.net/huutu/article/details/42318499 Unity 监听第一次进入播放 ...

  7. 【pytest】(四) pytest的一些其他的运行用法

    1. 可以设置当失败N个后停止测试 pytest -x 是当第一个失败产生后,停止 pytest --maxfail=2, 这里就是当失败2个用例后,停止测试 2.pytest 在命令行模式下支持多种 ...

  8. CodeForces - 505B-Mr. Kitayuta's Colorful Graph(暴力)

    Mr. Kitayuta has just bought an undirected graph consisting of n vertices and medges. The vertices o ...

  9. 文本三剑客之sed的用法

    第1章            Sed命令 1.1  sed 命令执行过程 1.2  sed介绍 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(p ...

  10. docker部署code-server实现在线开发

    1.前言 本文记录了通过docker.docker-compose部署code-server.mysql,搭建在线开发环境的过程,综合体验很爽,适合小规模开发团队使用. 安装环境: vmware hy ...