spring4.x(六)之第四章--bean 的配置及依赖注入

1. spring 配置概述

使应用程序中的 spring 容器启动成功,因具备的条件:
这里写图片描述
Bean配置信息是Bean的元数据信息,由4方面组成 :
这里写图片描述
Spring容器,Bean配置信息,Bean实现类以及应用程序的关系 :
这里写图片描述

2. 基于 XML 的配置

  • 基于XML的配置,Spring采用Schema格式的配置方案为许多领域的问题提供了简化的配置方法,简化了配置工作

采取基于Schema的配置格式,文件头的声明会复杂一些,看一个示例:
这里写图片描述

在上面定义了3种命名空间

  • 默认命名空间: 没有空间名,用于Spring Bean的定义
  • xsi标准命名空间: 这个命名空间用于为每个文档中的命名空间指定响应的Schema样式文件,是W3C定义的标准命名空间
  • aop命名空间: 这个命名空间是Spring配置AOP的命名空间,即一种自定义的命名空间

命名空间的定义分为两个步骤:

  • 指定命名空间的名称 : 需要指定命名空间的缩略名和全名
    如: xmlns:aop="http://www.springframework.org/schema/aop"
    aop为命名空间的别名,文档后面的元素可以通过命名空间的别名加以区分,如<aop:config/>,而http://www.springframework.org/schema/aop为空间的全限定名,习惯上用文档发布机构的官方网站或相关网站目录作为全限定名
    如果命名空间的别名为空,则表示该命名空间为文档默认命名空间。文档中无命名空间前缀的元素都属于默认命名空间,如<beans/>属于在①处定义的默认命名空间

  • 指定命名空间在Schema文档格式文件的位置,用空格或回车换行分隔 :为每个命名空间指定对应的Schema文档格式的定义文件
    语法:<命名空间 1> <命名空间 1 Schema文件> <命名空间 2> <命名空间 2 Schema文件>

    指定命名空间的Schema文件地址有两个用途:

    • XML解析器可以获取Schema文件并对文档进行格式合法性验证
    • 在开发环境下,IDE可以引用Schema文件对文档编辑提供诱导功能(自动补全功能)

对Schema文件的用途进行说明 :
这里写图片描述
这里写图片描述
这里写图片描述

3. Bean 的基本配置

这里写图片描述

  • id为这个Bean 的名称,通过容器的getBean(“Foo”)可以获取对应的Bean,在容器中祈祷定位查找的作用,class属性指定了Bean对应的实现类

4. Bean 的命名

  • id 在IoC容器中必须是唯一的,满足XML对id的命名贵方:必须以字母开始,后面可以是字母,数字,连字符。下划线,句号,冒号等完整结束的符号,逗号和空格这些非完整结束符是非法的
  • name 可以使用任何字符命名,包括特殊字符。
  • id和name都可以指定多个名字,名字之间可以逗号,分号或空格分隔

  • 如果有多个 name 相同的 bean,则通过getBean()获取Bean时,将返回后面声明的那个Bean,因为后面那个覆盖了前面的。所以建议使用 id

  • 如果id和name两个属性都没指定,如,Spring将自动将全限定类名作为Bean的名称
    这里写图片描述

4. 依赖注入:属性注入,构造函数注入,工厂方法注入

  1. 属性注入(最常用的注入方式): 指通过 setXxx() 方法注入 Bean 的属性值或依赖对象,属性注入具有可选择性和灵活性高的优点

    • 属性注入要求Bean提供一个默认的构造函数,并为需要注入的属性提供的Setter方法。 Spring先调用Bean 的默认构造函数实例化Bean对象,然后通过反射的方式调用Setter方式注入属性值
    • spring 只会检查 Bean 中是否有对应的 setter 方法,至于 bean 中是否有对应的属性成员变更则不做要求
  2. javaBean 关于属性命名的特殊规范
    一般Java的属性名都以小写字母开头,但JavaBean也允许以大写字母开头的属性变量名,但必须满足”前两个字母要么全部大写,要么全部小写” 的要求,为了避免错误,可以将像QQ,MSN,ID等专业术语在Java中一律调整为小写,保证命名的统一性

  3. 构造函数注入: 保证一些必要的属性在Bean实例化时就得到设置,确保Bean实例化后就可以使用

    1. **按类型匹配入参 :**spring 的配置文件采用和元素标签顺序无关的策略
      这里写图片描述
      在配置文件中使用构造函数注入的配置方式装配这个car Bean:
      这里写图片描述
    2. 按索引匹配入参: 如果Car构造函数有两个类型相同的入参,仅通过type就无法确定对应关系,这时需要通过入参索引来进行确定
      这里写图片描述
      Spring无法确定对应的是brand还是corp,因此通过显式指定参数的索引:
      这里写图片描述
    3. 联合使用类型和索引匹配入参 :
      这里写图片描述
    4. 通过自身类型反射匹配入参: 如果Bean构造函数入参的类型是可辨别的(非基础数据类型且入参类型各异),由于Java反射机制可以获取构造函数入参的类型,即使构造函数注入的配置不提供类型和索引的信息,Spring依然可以正确完成构造函数的注入工作
      这里写图片描述
      这里写图片描述
    5. 循环依赖问题 : Spring容器对构造函数配置的Bean进行实例化有一个前提,即Bean构造函数入参引用的对象必须已经准备就绪。 如果两个Bean都采用构造函数注入,而且都通过构造函数入参引用对方,会有类似死锁的循环依赖问题
      这时就需要使用属性注入
  4. 工厂方法注入:
    1. 非静态工厂方法: 必须实例化工厂类后才能调用工厂方法
      工厂类负责创建一个或多个目标类实例,工厂类方法一般以接口或抽象类变量的形式返回目标类实例:

      public class CarFactory {
      //创建Car的工厂方法
      public Car createTeslaCar(){
      Car car=new Car();
      car.setBrand("特斯拉modelS");
      return car;
      }
      }

      工厂方法的注入 :
      这里写图片描述
      注: 由于 carFactory 工厂类的工厂方法非静态,所以要首先定义一个工厂类的 Bean,然后通过 factory-bean 引用工厂实例,最后通过 factory-method 指定对应的工厂类方法
    2. 静态(static)工厂方法:

      public class CarFactory {
      public staticCar createTeslaCar(){ //工厂类方法是静态的
      ...
      }
      }

      当使用静态工厂类型的方法后,用户就无须在配置文件中定义工厂类的Bean,只需:
      这里写图片描述

参考: 在IoC容器中装配Bean(精通Spring+4.x++企业应用开发实战 四)

猜你喜欢

转载自blog.csdn.net/yin__ren/article/details/80924688