IoC容器 | 青训营

189 阅读5分钟

一、IoC概念及原理

  1. IoC是什么:
    • Inversion of Control(控制反转),一种软件设计原则
  2. IoC的作用:
    • 把对象创建和对象之间的调用过程,交给Spring进行管理,降低软件组件之间的耦合度
  3. 特点:
    • 在IOC容器里,组件不再负责主动创建或获取依赖的实例,而是通过容器被动地接收依赖
      • 结果:组件只需关注自己的业务逻辑,将对象的创建和生命周期等细节交给IOC容器处理
  4. 实现的两种方式:
    • 依赖注入(Dependency Injection:DI)
    • 依赖查找(Dependency Lookup)
  5. IoC底层原理:(两个核心概念)
    • 依赖注入(DI)
      • 通过注入依赖对象来实现控制反转
      • 容器负责创建和管理组件,并将所需的依赖对象通过构造函数、属性注入或方法注入等方式注入到组件中
      • 实现方式:(如何传递依赖对象)
        • 构造函数注入
        • 属性注入
        • 方法注入
    • 反射(Reflection)
      • 一种在运行时动态获取和操作对象的能力
      • 帮助IOC容器在运行时动态地创建和操作对象,实现依赖注入的过程
      • 使用方式:
        • 获取类的信息(通过Class对象)
        • 创建对象实例(通过构造函数)
        • 设置属性值(通过属性的set方法)
        • 调用方法(通过方法的invoke方法)

二、IoC接口(BeanFactory)

  1. BeanFactory接口
    • 定义了获取组件实例的基本方法
    • 提供的方法:
      • getBean:获取组件对应的实例对象
      • containsBean:判断容器里是否包含指定名称的组件
      • isSingleton:判断指定名称的组件是否为单例
  2. ApplicationContext接口
    • 继承自BeanFactory接口,所以除了BeanFactory接口提供的基本功能,还有很多高级功能(国际化、事件处理、资源加载)
    • 提供的方法:
      • getMessage:获取国际化信息
      • publishEvent:发布事件
  3. BeanPostProcessor接口
    • 一个后置处理器接口,用于在容器实例化和依赖注入过程中对组件进行额外的处理操作
    • 提供的方法:
      • postProcessBeforeInitialization:在组件初始化之前进行处理
      • postProcessAfterInitialization:在组件初始化之后进行处理

三、IOC操作Bean管理

  1. Spring里有两种bean
    • 普通bean
      • 特点:在配置文件中的定义bean类型就是返回类型
    • 工厂bean(FactoryBean)
      • 特点:在配置文件中的定义bean类型可以和返回类型不一样
        • 创建方式
          • 首先创建类(作为工厂bean,实现接口FactoryBean)
          • 实现接口里面的方法,在实现的方法中定义返回的bean类型
  2. bean作用域
    • 默认情况下,bean为单实例对象
    • 设置单实例、多实例
      • 设置bean标签里的scope属性
        • 属性值
          • 默认值:singleton(单实例对象)
            • 特点:在加载spring配置文件时就会创建单实例对象
          • prototype(多实例对象)
            • 特点:在调用getBean方法时创建一个多实例对象
  3. bean的生命周期
    • 定义
      • 从对象创建到销毁的过程
    • 具体过程
      • 通过构造器创建bean实例(无参数构造)
      • 为bean的属性设置值和对其他bean引用(调用set方法)
      • 调用bean的初始化方法(需要进行配置初始化的方法)
      • bean可用
      • 容器关闭时,bean被销毁(需要进行配置销毁的方法)
  4. Bean管理:
    • 即两个操作:
      • Spring创建对象
      • Spring注入属性
  5. Bean管理操作:
    • 第一种方式:基于xml配置文件
      • 手动管理
        • 基于xml方式创建对象
          • spring配置文件里,使用bean标签,配置属性,实现对象的创建
            • 属性
              • id:获取的对象其唯一标识
              • class:包类路径(类全路径)
          • 特点:
            • 创建对象时,默认也是执行无参的构造方法完成对象的创建
        • 基于xml方式注入属性
          • 依赖注入(DI)
            • 第一种注入方式:使用set方法
              • 创建属性及属性对应的set方法
              • spring配置文件里创建对象,注入属性(bean+property)
            • 第二种注入方式:使用有参数构造进行注入
              • 创建类,定义属性,创建有参数的构造方法
              • spring配置文件里有参数构造注入属性
          • 注入其他类型属性
            • 属性值包含特殊符号 - 使用转义 / (value标签里)
            • 注入集合属性
              • 数组类型、List集合类型、Map集合类型
          • 注入属性
            • 外部bean
            • 内部bean和级联赋值
      • 自动装配
        • 是什么:
          • 根据指定装配规则(属性名称或属性类型),Spring自动将匹配的属性值进行注入
        • 装配流程:
          • 根据属性名称自动注入
          • 根据属性类型自动注入
      • 通过外部属性文件管理XML
        • 直接配置数据库信息
          • 配置德鲁伊连接池
          • 引入德鲁伊连接池依赖jar包
        • 引入外部属性文件配置数据库连接池
          • 创建外部属性文件,properties格式文件,写数据库信息
          • 把外部properties属性文件引入到spring配置文件中
            • 引入context名称空间
            • 在spring配置文件使用标签引入外部属性文件
    • 第二种方式:基于注解方式
      • 注解:
        • 注解是什么:
          • 代码特殊标记
            • 格式:@注解名称(属性名称=属性值,属性名称=属性值)
        • 使用注解
          • 注解作用在类上面,方法上面,属性上面
        • 使用注解目的:
          • 简化xml配置
      • Spring针对Bean管理中创建对象提供注释(下面四个注解功能一样,都能用来创建Bean实例)
        • @Component
        • @Service
        • @Controller
        • @Repository
      • 基于注解方式实现对象创建
        • 第一步:引入依赖(除了基本的依赖,还有aop)
        • 第二步:开启组件扫描
        • 第三步:创建类,在类上添加创建对象注解
      • 基于注解方式实现属性注入
        • @Autowired:根据属性类型进行自动装配
        • @Qualifier:根据属性名称进行注入
        • @Resource:可以根据类型注入,可以根据名称注入
        • @Value:注入普通类型属性
      • 完全注解开发
        • 创建配置类,替代xml配置文件
        • 编写测试类