• Spring学习(二)--Spring的IOC


    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,理解有点困哪啊!!)

  • 相关阅读:
    easyui-datetimebox设置默认时分秒00:00:00
    分页工具类的封装
    关于查询排序DTO的封装
    android签名生成和发布
    android httpclient 设置超时
    Eclipse 模拟http 请求插件Rest Client
    volley 发送post请求
    mac book 华为C8815不能debug
    android一些小技巧
    PS相关技术
  • 原文地址:https://www.cnblogs.com/carblack/p/10839232.html
Copyright © 2020-2023  润新知