美文网首页
Spring IoC

Spring IoC

作者: AnyL8023 | 来源:发表于2020-09-03 11:10 被阅读0次

    两个主要容器:

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

    IoC容器的接口设计图:


    这里写图片描述

    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定位过程:

    这里写图片描述

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

    这里写图片描述

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

    这里写图片描述

    IoC容器的依赖注入

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

    这里写图片描述

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

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

    容器初始化和关闭过程

    这里写图片描述

    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

          本文链接:https://www.haomeiwen.com/subject/nbunsktx.html