Spring IoC

两个主要容器:

  1. 实现BeanFactory接口的简单容器系列:实现容器的最基本功能
  2. ApplicationContext:增加了许多面向框架的特性,同时对应用环境作了许多适配

IoC容器的接口设计图:


Spring IoC_第1张图片
这里写图片描述

BeanFactory

接口方法:

  • containsBean
  • isSingleton
  • isPrototype
  • isTypeMatch
  • getType
  • getAliases

设计原理:(以XmlBeanFactory为例)
编程式使用IoC容器:

ClassPathResource res = new ClassPathResource("bean.xml");
    DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
    reader.loadBeanDefinitions(res);

步骤:
1. 创建IoC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息
2. 创建一个BeanFactory,这里使用DefaultListableBeanFactory
3. 创建一个载入BeanDefinition的读取器,通过一个回调配置给BeanFactory
4. 从定义好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成。

IoC容器的初始化过程

Resource定位过程:

Spring IoC_第2张图片
这里写图片描述

BeanDefinition的载入和解析:
对IoC容器来说,这个载入过程,相当于把定义的BeanDefinition在IoC容器中转化为一个Spring内部表示的数据结构的过程,这些BeanDefinition数据在IoC容器中通过一个HashMap来保持和维护。

Spring IoC_第3张图片
这里写图片描述

BeanDefinition在IoC容器中的注册:
DefaultListableBeanFactory中实现了BeanDefinitionRegistry的接口,这个接口的实现完成BeanDefinition向容器的注册,就是把解析得到的BeanDefinition设置到hashMap中去。

Spring IoC_第4张图片
这里写图片描述

IoC容器的依赖注入

什么时候注入:在用户第一次向IoC容器索要bean的时候(lazy-init预实例化除外)

Spring IoC_第5张图片
这里写图片描述

两种实例化Java对象的方法:

  • 通过BeanUtils,使用Java反射功能
  • 通过CGLIBEnhancer类的create方法

容器初始化和关闭过程

Spring IoC_第6张图片
这里写图片描述

Bean的生命周期:
1. Bean实例的创建
2. 为Bean实例设置属性
3. 调用Bean的初始化方法
4. 应用可以通过IoC容器使用Bean
5. 当容器关闭时,调用Bean的销毁方法

lazy-init属性和预实例化:refresh初始化容器的时候去getBean去触发依赖注入

FactoryBean的实现:类似于抽象工厂模式,封装Proxy、RMI、JNDI等

BeanPostProcessor的实现:
两个方法:postProcessBeforeInitialization/postProcessAfterInitialization

IoC容器对Bean的初始化

  • 为类型是BeanNameAware的Bean设置Bean的名字
  • 为类型是BeanClassLoaderAware的Bean设置类装载器
  • 为类型是BeanFactoryAware的Bean设置自身所在的IoC容器以供回调使用
  • postProcessBeforeInitialization/postProcessAfterInitialization的回调
  • 初始化属性init-method的处理

autowiring(自动依赖装配)的实现

    //开始进行依赖注入过程,先处理autowiring的注入
    if (mbd.getResolvedAutowiredMode() == RootBeanDefinition.AUTOWIRE_BY_NAME || mbd.getResolvedAutowiredMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
        MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
        //这里是对autowire注入的处理,根据Bean的名字或者type进行autowire的过程
        if (mbd.getResolvedAutowiredMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
            autowireByName(beanName, mbd, bw, newPvs);
        }
        if (mbd.getResolvedAutowiredMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
            autowireByType(beanName, mbd, bw, newPvs);
        }
        pvs = newPvs;
    }

你可能感兴趣的:(Spring IoC)