Spring源码系列一:Ioc 思想与实现过程

Spring源码系列一:Ioc 设计理念

1.怎么理解Ioc?

IoC(Inversion of Control) 也称为依赖注入(dependency injection, DI)。它是一个对象定义依赖关系的过程,也就是说,对象只通过构造函数参数、工厂方法的参数或对象实例构造或从工厂方法返回后在对象实例上设置的属性来定义它们所使用的其他对象。然后容器在创建bean时注入这些依赖项。
这个过程基本上是bean的逆过程,因此称为控制反转(IoC)。
所以Ioc可以理解为,Ioc是一种设计思想,而实现这种设计思想的方法叫做DI

2.Ioc的执行过程

在这里插入图片描述

  1. 装配bean的方式:xml @compomentScan +@compoment @bean @import @importResource @conditional

  2. 通过BeanDefinitionReader解析成spring能控制的最小单元bean->BeanDefinition 所有bean的共性:beanClass=xxx.class abstract=false lazyInit=false scope=singleton autowireMode=0 (0-> no 1->byType 2->byName 3->Constructor)
    在这里插入图片描述
    ScannedGenericBeanDefinition: @CompomentScan + @Compoment AnnotatedGenericBeanDefinition: @Import注解
    ConfigurationClassBeanDefinition: @bean

  3. BeanDefinitionRegistry(Spring中最重要的实现类,DefaultListableBeanFactory 即是beanFactory,也是一个注册器,registerBeanDefinition(beanName,beanDefinition)) bean注册器把上述装配的xxx.class都注册到beanDefinitionMap(CurrentHashMap)缓存

  4. 容器启动时加载 !bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit() 所有非懒加载的,非抽象的,单例的bean;

  5. 首先1.doGetBean(name, null, null, false) -> Object sharedInstance = getSingleton(beanName) -> Object singletonObject = this.singletonObjects.get(beanName)
    先判断单例对象池中是否存在?
    存在直接返回bean-> bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
    是否是factoryBean类型?
    if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
    return beanInstance;
    }
    getObjectFromFactoryBean(factory, beanName, !synthetic)

  6. 创建bean
    单例对象池中不存在,此时判断Bean的类型:单例,原型?
    原型:直接 createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    单例:再一次从单例对象池中获取,如果没有调用singletonFactory.getObject()去创建bean
    doCreateBean(beanName, mbdToUse, args)->
    BeanWrapper beanWrapper =createBeanInstance(beanName, mbd, args) ->
    addSingletonFactory(beanName, getEarlyBeanReference(beanName, mbd, bean))->
    populateBean(beanName, mbd, instanceWrapper)->
    initializeBean(beanName, exposedObject, mbd)->
    addSingleton(beanName, singletonObject)

  7. DefaultListableBeanFactory 实现了BeanDefinitionRegistry ,ConfigurableListableBeanFactory
    所以就会同时拥有注册bean的功能,和获取所有bean的功能

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值