spring ioc原理解析

2,782 阅读2分钟

概述

Spring IOC控制反转,分为两个方面解释:

  1. 控制:对象对于内部成员的控制
  2. 反转:将之前对象管理自己内部成员,转变为ioc容器管理,目的是接耦

IOC的好处是:

  1. 无需手动创建,拿来就用
  2. 享受单例的好处,效率高、节省空间
  3. 统一配置,方便管理


原理

spring ioc容器原理是根据Java的反射机制,获取类的所有信息,再通过xml或者注解配置获取类与类之间的关系,最后根据以上信息构建类与类之间的依赖。

容器加载bean原理如下:

  1. 根据xml、注解获取bean的配置信息,在容器内部创建注册表
  2. 根据注册表实例化bean,并创建bean与bean之间的依赖
  3. 将初始化的bean保存在容器的缓存中(hashmap),等待客户端调用(bean的作用域为singleton,如果为property则不缓存直接返回)


Spring容器

bean工厂分为两种:

  1. BeanFactory,面向Spring
  2.  ApplicationContext,基于BeanFactory基础,实现了一系列功能

两者区别?

  1. BeanFactory初始化bean采用懒加载,在获取的时候才创建;ApplicationContext启动时一次性全部加载,如果配置错误则无法启动容器,可以提前检测配置正确性,当然也导致容器启动速度慢
  2. 对于配置文件,ApplicationContext提供了访问URL和文件访问的接口
  3. ApplicationContext支持aop
  4. BeanFactory接口需手动注册,ApplicationContext自动

容器启动原理

web环境Spring、Spring mvc容器加载过程

对于一个web应用,部署在web容器中,容易提供一个全局应用上下文(ServletContext),为后面的IOC容器提供宿主环境。

其次,因为web.xml中会提供有contextLoaderListener(或ContextLoaderServlet),当web容器启动后,触发IOC容器初始化时间,contextLoaderListener监听到事件后,Spring将初始化一个上下文(WebApplicationContext接口),实现类为XmlWebApplicationContext(IOC容器)。 IOC初始化后,开始初始化各种servlet(DispatchServlet),以IOC容器为宿主环境进行初始化(两者都有属于自己的bean缓存)

bean生命周期


Spring IOC模式与工厂模式的区别?

当需求改变,工厂模式需要手动修改;IOC是动态生成的