Spring4 之 IOC & DI

Spring4 之 IOC & DI

前言

本节我们学习一下 Spring IOC 和 DI。首先我们了解一下什么时Spring。

Spring 为简化企业级应用开发而生的一个开源框架. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能。从Spring 的内部结构看,Spring 是一个 IOC(DI) 和 AOP 容器框架。

具体描述一下Spring

  • Light Weight:Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API

  • Inversion of Control:依赖注入(DI — dependency injection、IOC)

  • aspect oriented programming:面向切面编程

  • container:Spring 是一个容器, 因为它包含并且管理应用对象的生命周期

  • Framework:Spring 实现了使用简单的组件配置组合成一个复杂的应用. 在 Spring 中可以使用 XML 和 Java 注解组合这些对象

  • One-Stop(一站式):在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库 (实际上 Spring 自身也提供了展现层的 SpringMVC 和 持久层的 Spring JDBC)

  • Spring Architecture

    Spring4 之 IOC & DI_第1张图片


概念

  • IOC(Inversion of Control)

    其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式

  • DI(Dependency Injection)

    IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入. 相对于 IOC 而言,这种表述更直接


IOC Container

在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用。

Spring 提供了两种类型的 IOC 容器实现

  • BeanFactory: IOC 容器的基本实现

    • BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身
  • ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口

    • ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory

      Spring4 之 IOC & DI_第2张图片

    • ApplicationContext 的主要实现类

      • ClassPathXmlApplicationContext:从 类路径下加载配置文件
      • FileSystemXmlApplicationContext: 从文件系统中加载配置文件
    • ConfigurableApplicationContext

      • 扩展于 ApplicationContext,新增加两个主要方法:refresh() 和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力
    • ApplicationContext

      • 在初始化上下文时就实例化所有单例的 Bean。
    • WebApplicationContext

      • WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作

DI

在Spring目前支持 3 依赖注入方式。

  • 属性注入

    • 属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象

    • 属性注入使用 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 子节点指定属性值

    • 属性注入是实际应用中最常用的注入方式

    • 一个栗子
      其中 Orders 是一个 Entity。

      id="orderOne" class="com.spring.example.entiry.Orders">
          <property name="orderId" value="123465798">property>
          <property name="tradeArea" value="PECIA">property>
          <property name="tradeTime" value="July,12th,2017">property>
      
  • 构造器注入

    • 通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用

    • 构造器注入在 元素里声明属性, 中没有 name 属性

    • 一个栗子

      "jedisPool" class="redis.clients.jedis.JedisPool">
        index="0" ref="jedisPoolConfig"/>
        index="1" value="${redis.host}"/>
        index="2" value="${redis.port}" type="int"/>
        index="3" value="${redis.timeout}" type="int"/>
        index="4" value="${redis.password}"/>
      </bean> 
  • 工厂方法注入(很少使用,不推荐)


小结

  • 就目前而言Spring 是一个非常优秀的Framework。在项目使用时Spring 不仅大大地提高了开发效率还能满足不同的扩张需求(比如与第三方 Dev. Tool相结合)。

  • IOC 和 DI是 Spring 的两个核心体现。

你可能感兴趣的:(Spring4)