SpringIOC控制反转的原理详解

 更新时间:2023年08月17日 08:29:31   作者:刘婉晴  
这篇文章主要介绍了SpringIOC控制反转的原理详解,本来管理业务对象(bean)的操作是由我们程序员去做的,但是有了 Spring 核心容器后,这些 Bean 对象的创建和管理交给我们Spring容器去做了,也就是控制权由程序员变成了容器,需要的朋友可以参考下

一、 IOC 的概念

Spring 的 IOC ,即控制反转

所谓控制反转 —— 本来管理业务对象(bean)的操作是由我们程序员去做的,但是有了 Spring 核心容器后,这些 Bean 对象的创建和管理交给我们Spring容器去做了,也就是控制权由程序员变成了容器。

Spring 通过 Java 语言的反射机制实现实例化 Bean ,并建立 Bean 之间的依赖关系。

除此之外,Spring IOC 还提供 Bean 实例缓存,生命周期管理,Bean 实例代理等高级服务。

二、 高层视图

Spring 应用启动时,读取 Bean配置信息,在容器中生成注册表,然后根据注册表去实例化 Bean,再将实例化好的 Bean 放入 Spring 容器的 Bean 缓存池中,为上层应用程序使用。

在这里插入图片描述

三、 实现

BeanFactory 面向 Spring 本身, ApplicationContext 面向使用 Spring 框架的开发者。

BeanFactory

在这里插入图片描述

BeanDefinitionRegistry 注册表

Spring 配置的每一个 Bean 通过 BeanDefination 表示,描述了 Bean 的配置信息,BeanDefinitionRegistry 提供了向容器中注册 BeanDefination 的方法。

BeanFactory

getBean() 从容器中获取指定名称的 Bean

  • ListableBeanFactory : 提供访问容器 Bean 信息的方法
  • HierarchicalBeanFactory : 父子级联 ,实现子容器可以访问父容器的 Bean,但是父容器不能访问子容器的 Bean
  • ConfifurableBeanFactory : 增强了IOC容器的定制性。
  • SingletonBeanFactory : 允许运行时向容器中注册单例 Bean

ApplicationContext

ApplicationContext 由 BeanFactory 派生而来,提供了更多面向实际应用的功能

比如从类路径加载配置文件等 …

在这里插入图片描述

四、 Bean 的作用域和生命周期

作用域

  • Singleton : 单例模式,全局只有一个对象,多线程下不安全
  • Prototype : 原型模式,在每次使用时创建,每个 Bean 有自己的属性和状态
  • Request : 一次 Request 中一个实例
  • Session
  • Global Session

生命周期

  • 实例化
  • IOC 依赖注入
  • setBeanName
  • BeanFactoryAware
  • ApplicationContentAware
  • 接口实现-初始化预处理
  • 初始化方法
  • postProcessAfterInitialization
  • 过期自动清理/自动配置清理

到此这篇关于SpringIOC控制反转的原理详解的文章就介绍到这了,更多相关SpringIOC控制反转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ehcache模糊批量移除缓存的方法

    ehcache模糊批量移除缓存的方法

    本篇文章主要介绍了ehcache模糊批量移除缓存的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • SpringMVC访问静态资源的方法

    SpringMVC访问静态资源的方法

    本篇文章主要介绍了SpringMVC访问静态资源的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java实现经典大富翁游戏的示例详解

    Java实现经典大富翁游戏的示例详解

    大富翁,又名地产大亨。是一种多人策略图版游戏。参与者分得游戏金钱,凭运气(掷骰子)及交易策略,买地、建楼以赚取租金。本文将通过Java实现这一经典游戏,感兴趣的可以跟随小编一起学习一下
    2022-02-02
  • Java编码辅助工具Mapstruct用法详解

    Java编码辅助工具Mapstruct用法详解

    这篇文章主要介绍了Java编码辅助工具Mapstruct用法详解,手动编码setter/getter各个对应属性,会显得臃肿繁琐。通过Mapstruct框架可简单方便地完成这一工作。,需要的朋友可以参考下
    2019-06-06
  • Java中UUID生成原理及优缺点

    Java中UUID生成原理及优缺点

    本文将详细讲解UUID的生成原理、特性、实用场景以及优缺点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • SpringCloud中的Eureka注册中心详细解读

    SpringCloud中的Eureka注册中心详细解读

    这篇文章主要介绍了SpringCloud中的Eureka注册中心详细解读,想要参与服务注册发现的实例首先需要向Eureka服务器注册信息,注册在第一次心跳发生时提交,需要的朋友可以参考下
    2023-11-11
  • Springboot ApplicationRunner的使用解读

    Springboot ApplicationRunner的使用解读

    这篇文章主要介绍了Springboot ApplicationRunner的使用解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Java Spring 事件监听详情解析

    Java Spring 事件监听详情解析

    这篇文章主要介绍了Java Spring 事件监听详情解析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • mybatis中<if>标签bool值类型为false判断方法

    mybatis中<if>标签bool值类型为false判断方法

    这篇文章主要给大家介绍了关于mybatis中<if>标签bool值类型为false判断方法,文中通过示例代码介绍的非常详细,对大家学习或者使用mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Java编程线程间通信与信号量代码示例

    Java编程线程间通信与信号量代码示例

    这篇文章主要介绍了Java编程线程间通信与信号量代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论