当前位置: 首页 > news >正文

一.重新回炉Spring Framework: 理解Spring IoC

1. 写在前面的话

说实话,从事java开发工作时间也不短了,对于Spring Framework,也是天天用,这期间也碰到了很多问题,也解决了很多问题。可是,总感觉对Spring Framework还是一知半解,不能有个更加全面的理解。既然这样,我就想,那就单独抽出一段时间,来重新回炉一下Spring Framework,这样也能在以后的学习拓宽一下解决问题的思路。
那怎么回炉了,我打算以Spring Framework的源码为依据,从面到点的,慢慢扣一下它的细节,这就不得不涉及spring框架的源码阅读环境的搭建,这并不是一个特别简单的过程。为此,我在春节前根据自己的搭建过程,专门写了一篇spring框的源码搭建过程,供大家审阅。源码地址如下:
https://blog.csdn.net/lvxinchun/article/details/135972648

2. IoC理论

2.1 IoC的概念

IoC,英文全程为Inversion of Control,中文一般翻译为 “控制反转”,就是由 Spring IoC 容器来负责对象的生命周期和对象之间的关系。它并不是特指某个技术,而是一种设计思想。

2.2 诠释IoC的概念

IoC,被称为控制反转,好,这里就从“控制反转”这四个字的字面意思来扣一下它更深的含义,来加深对IoC的理解。
首先我们说“控制”,这是一个动词,那它就要有主语和宾语,那主语就是谁控制,宾语就是控制了什么,所以我们首先要理解的就是谁来控制,控制了什么?
然后我们再说“反转”,“反转”这个词,本身就是有一种打破常规的意思,也就是不再墨守常规,而是反过来。那我们就要研究下怎么反转的,反转了什么东西?
所以,诠释IoC的概念,就变成了我们要探寻的下面两个问题:

  1. 谁来控制,控制了什么?
  2. 怎么反转的,反转了什么东西?
2.2.1 谁来控制,控制了什么?

在这里插入图片描述
通过图1我们看到,在传统方式下,是由客户端类或者启动类主动创建对象,即当前对象或者类来控制依赖对象(创建、销毁等);而在IoC方式下,是由IoC容器来主动创建对象,即IoC容器来控制依赖对象(创建、销毁等)。

2.2.2 怎么反转的,反转了什么东西?

在这里插入图片描述
通过图3和图4,结合图1和图2我们看到,相比于传统方式,反转主要体现在两个方面:
第一,反转了对象的创建方式(由客户端类编程了IoC容器);
第二,反转了对象的组装(其实是对象之前的关系维护)方式(由客户端类组装改为了IoC容器的自动注入);
但不论是对象的创建还是组装,都是一种对象的控制权,所以,反转的其实就是对象的控制权(生命周期的管理)。

2.2.3 小结

所以,IoC对编程带来的最大改变是从思想上,发生了“主从换位”的变化。应用程序需要任何对象(资源),都要主动的去创建对象,事无巨细的亲力亲为(对象的组装),而现在只需要从IoC容器中拿所需要的对象就可以了,拿到的对象也不需要亲自组装了(IoC已经把依赖的对象注入进去了)。

3. DI依赖注入

3.1 依赖注入的概念

DI,英文全程Dependency Injection,中文翻译为依赖注入,很多人说依赖注入就是控制反转,是IoC的另外一种理解,我觉得这么说是有些牵强的,至少是不全面的。在传统方式下,如果我们创建的对象还需要其他外部资源(对象、常量数据等等),那么我们不仅仅要创建当前对象,还要创建当前对象所依赖的对象,创建完成所依赖的对象,还要在将所依赖的对象设置到当前对象中,如下面代码:

User user = new User();
UserDateail detail= new UserDetail();
user.setUserDetail(detail);

而使用IoC容器,我们只需要在xml中定义好对象的关系,由IoC来自动创建好各个对象,并且会自动将当前对象所依赖的对象注入进来。User对象需要UserDetail对象,我们就只需要告诉IoC容器(XML的配置),User对象中需要一个UserDetail对象,至于这个UserDetail对象怎么创建,什么时候创建,User对象不需要知道。只要在在系统运行时,IoC会在适当的时候制造一个UserDetail对象,然后像打针一样,注射到User对象当中,这样就完成了对各个对象之间关系的控制。User对象需要依赖UserDetail对象才能正常运行,而这个UserDetail对象是由IoC注入到User对象中的,依赖注入的名字就这么来的。

3.2 小结

我认为,所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。所以依赖注入主要体现的是各个对象之间的关系的自动维护和管理,而没有更好的体现对象创建权的转变。

4. 对Spring Framework的整体理解

Spring Framework是一个框架,在我们使用Spring整个开源体系开发流程中,所有的框架几乎都依赖于Spring Framework。Spring Framework帮我们起到了一个IOC容器的作用,用来承载我们整体的bean对象,它帮我们进行了整个对象从创建到销毁的整个生命周期的管理。在我们使用Spring Framework的时候,可以使用配置文件,也可以使用注解的方式进行相关实现,当我们程序启动开始的时候,我们把配置文件或者注解定义好的那些bean对象转换成一个beanDefition,然后完成整个beanDefition的解析和加载过程。当我们获取到这些完整的beanDefition对象之后,对整个beanDefintion进行实例化操作,在进行实例化的时候,最简单的一种方式是通过反射的方式来创建对象bean(只是在堆里开辟了一个内存),但这没有完成后续一系列初始化操作,还会在后面实现awre接口的操作、包括实现一些初始化操作,包括我要实现AOP的操作的话,可能要执行一些beanPostProcessor操作。当然,在beanDefition的环节,也会执行一系列beanfactoryPostProcessor的操作来实现相关的扩展操作。当我们整体对象都创建完成之后,对象就可以直接调用了。
在这里插入图片描述

相关文章:

  • Python第十九章(模块)
  • PyCharm 新建目录 (directory or folder)
  • JavaScript 设计模式之组合模式
  • ubuntu 22.04 图文安装
  • Java使用Redis实现分页功能
  • 微服务中4种应对跨库Join的思路
  • 如何选择最适合的图纸加密软件?用户体验及性价比
  • 同一台宿主机上虚拟机CPU资源分配方式介绍
  • 【Redis实战】有MQ为啥不用?用Redis作消息队列!?Redis作消息队列使用方法及底层原理高级进阶
  • 剑指offer面试题16 反转链表
  • 【栈】150. 逆波兰表达式求值
  • 面向对象编程入门:掌握C++类的基础(1/3)
  • MCU中断控制
  • CSRNET图像修复,DNN
  • http协议与apache
  • ES6指北【2】—— 箭头函数
  • [数据结构]链表的实现在PHP中
  • 【刷算法】求1+2+3+...+n
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Linux各目录及每个目录的详细介绍
  • Map集合、散列表、红黑树介绍
  • MobX
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Redux系列x:源码分析
  • webgl (原生)基础入门指南【一】
  • web标准化(下)
  • yii2权限控制rbac之rule详细讲解
  • 关于Java中分层中遇到的一些问题
  • 基于axios的vue插件,让http请求更简单
  • 基于组件的设计工作流与界面抽象
  • 技术胖1-4季视频复习— (看视频笔记)
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端之React实战:创建跨平台的项目架构
  • 使用Gradle第一次构建Java程序
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 我感觉这是史上最牛的防sql注入方法类
  • 延迟脚本的方式
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Android开发者必备:推荐一款助力开发的开源APP
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​力扣解法汇总946-验证栈序列
  • ​用户画像从0到100的构建思路
  • #if 1...#endif
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .NET BackgroundWorker
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET Core中的去虚
  • .net refrector
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?