【Spring】Spring IOC 基本原理

Spring IOC

Bean 的生命周期

  1. 实例化 Bean 对象。
    • 通过反射创建对象,分配内存,此时属性值都是默认值。
  2. 属性注入
    1. 解析自动装配自动注入)( autowire 的值: byName, byType, constructor, no),设置对象的属性。
      1. no: 不使用自动装配,通过手工设置 ref 属性来装配。也就是自行使用 <property>, <construct-arg> 标签,设置 ref, value 值。
      2. byName:不是按照属性里面的名字,是按照Bean的名字,在类里面就是set方法后面的名字。
      3. byType:感觉参数类型装配,就是setter 的参数类型。
      4. constructor:找到构造函数,然后根据构造函数中的参数类型来找,如果类型匹配到多个再根据名字来找。
    2. 可能会出现循环依赖。
  3. 初始化
    1. 检查Aware相关接口,如果实现了相关的Aware接口,就调用相关回调方法。
    2. 调用 BeanPostProcessors 的前置处理函数。
    3. 调用初始化生命周期回调函数,有三种方法实现初始化生命周期的回调函数:
      1. 使用注解:@PostConstruct
      2. 实现 InitializingBean 接口,重写 afterPropertiesSet() 方法。
      3. 指定 init-method
        1. 使用@Bean(init-method=xxx)
        2. <bean> 标签中指定 init-method。
    4. 如果 Bean 实现了 AOP,那么会创建动态代理类。
    5. 需要代理的话,则创建代理。
    6. 调用 BeanPostProcessors 的后置处理方法。
  4. 销毁
    1. 在 Spring 容器关闭的时候进行调用。
    2. 调用销毁生命周期的回调方法。

Spring IOC

什么是 Spring IOC 容器

  • 什么是 IOC 容器:负责管理 Bean。

    • IOC 容器的核心设计是 BeanFactory 接口 与 ApplicationContext 接口。
    • new ApplicationContext() 会加载。
  • BeanFactory 接口 提供了 IOC 容器最基本的功能。如:getBean() 从容器中获得Bean。

    • Bean 的加载时机:BeanFactory 的实现类采用的是延迟加载(容器启动时,不会对Bean 进行实例化,有需要使用 Bean 时才进行实例化)。
    • 使用场景:资源宝贵的移动设备中,可能会优先选择 BeanFactory。
  • ApplicationContext 接口 扩展了 BeanFactory。ApplicationContext 接口继承了 BeanFactory,并且继承了MessageSource,ResourceLoader, ApplicationEventPublisher 接口,在简单的IOC容器基础上添加了许多高级容器的特性。

    • 实现的接口

      • MessageSource:支持信息源,可以实现国际化?

      • ResourceLoader:访问资源。

      • ApplicationEventPublisher :支持应用事件。

    • 实现

      • FileSystemXmlApplicationContext:需要传入文件位置。

      • ClassPathXmlApplicationContext:需要传入 CLASSPATH

      • XmlWebApplicationContext

    • Bean 的加载时机:IOC 容器创建时,就进行 Bean 的加载。(因此需要更多的系统资源)

    • 使用场景:包含了 BeanFactory 的所有功能,一般使用 ApplicationContext 而不是 BeanFactory。

Spring IOC 启动流程

  1. 阶段1:容器启动阶段

    1. 从 new 一个 ApplicationContext 实例开始。

    2. 调用 invokeBeanFactoryPostProcessors BeanFactoryPostProcessors 的后置处理方法,读取配置,创建 BeanDefinition 用来存放 Bean 的基本信息。

      1. BeanDefinitionReader 接口,?
      2. 解析 @ComponentScan ,扫描包下面的类有没有 @Component 注解,有的话就生成对应的 BeanDefinition。
      3. 将 BeanDefinition 对象放入 beanDefinitionMap 中。
    3. 判断 是否符合 BeanFactory 的 getBean() 的生产标准。

      • 要为单例,不能是 懒加载。
  2. 阶段2:Bean 创建阶段。

    1. 推断构造函数。由于Spring 实例化对象是通过构造方法反射,因此需要知道使用哪个构造方法。

    2. 实例化:反射(根据 BeanDefinition 中的信息)+工厂。

    3. 属性注入。

      1. 可能出现循环依赖。
    4. 初始化。

      1. 检查 Aware 相关接口,如果实现了就调用相应的回调方法。
      2. 生产代理对象。(包括 AOP)
      3. 调用初始化生命周期的回调方法。(三种方式)
    5. 加入单例池:就是加入三级缓存中的一级缓存,即名为 singletonObjects 的 HashMap。

Spring IOC 实现原理

  • IOC 容器是通过:工厂 + 反射 实现的。

  • 基于 XML 配置文件的 Spring IOC 原理。

    • 创建 Spring IOC 容器。

      • ApplicationContext context = new ClassPathApplicationContext("Beans.xml")
    • 解析器解析 xml 文件,获得 id 以及 class 属性对应的值。

    • 使用反射机制,获得对象。

    • 准备 IOC容器,存放对象。

Reference

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值