Spring IOC概念与原理详解

IOC

IOC,Inversion Of Control,直译过来就是控制反转,它是一种设计思想。

在传统的Java Se中,我们通过new来创建一个新的对象,是程序主动去创建依赖对象。而IOC有一个专门的容器来创建这些对象,也就是说,由IOC容器来进行对象的创建,将它们装配在一起,并管控其完整的生命周期。对象的创建由主动行为变成被动行为,控制权颠倒过来了,这也就是"控制反转"名称的由来。IOC的流程如下图所示。
Spring IOC概念与原理详解_第1张图片
既然IOC是控制反转,那么到底哪些方面被反转了呢?主要是获取依赖对象的过程被反转了。控制被反转后,获取依赖对象的过程由用户管理变更为由IOC容器注入。因此,IOC也被称为依赖注入(Dependency Injection)。

IOC容器:
IOC容器是Spring框架的核心,帮助用户管理bean从创建到销毁的整个生命周期,用户只是通过getBean("beanName")来获取并使用bean对象。在Spring中,一般存在三级缓存,使用Map结构来存储对象。最常用的是一级缓存singletonObjects,用来存放完整bean对象。
Spring容器有一个最上层的根接口BeanFactory,没有提供对应的子类实现。在实际的应用过程中,最普遍使用是DefaultListableBeanFactory。另外一个常用的是ApplicationContext,它是实现了BeanFactory接口的一个针对Web开发而产生的拥有更多spring定制功能的容器。

Spring容器在开发中所起到的作用就是将xml、注解等配置元信息包装成bean对象。这个过程可以分为两部分:

  • 容器的启动:将所有的配置信息(xml、注解)通过BeanDefinition类进行封装,生成对应的BeanDefinition对象。然后调用BeanDefinitionRegisterregister方法将其加入的register容器中。
  • 容器中bean的实例化:当所有的BeanDefinition对象都准备完毕,spring就会开始getBean() -> doGetBean()->createBean() -> doCreateBean() 来创建对象。

IOC的底层实现(执行逻辑):

  1. 先通过createBeanFactory创建出一个Bean工厂,一般是DefaultListableBeanFactory
  2. 将所有的配置信息封装为BeanDefinition对象。
  3. Bean工厂创建完成后,开始循环创建对象。由于容器中的bean默认是单例,因此先通过getBean() -> doGetBean()从容器中查找。
  4. 如果容器中找不到,通过createBean() -> doCreateBean() -> createBeanInstance(),以反射的方式来创建bean对象。一般通过getDelaredConstructor()来获取无参构造器,并通过newInstance()来创建对象。
  5. 通过populateBean()来进行对象的属性填充。
  6. 通过initializingBean()来对进行其他的初始化操作。

依赖注入DI:
依赖注入DI,其实和IOC是同一个东西。IOC是一种思想,DI是具体的实现方式。从Spring容器的角度来看,容器把对象赋值给调用者的成员变量。

你可能感兴趣的:(Spring,java,spring)