如果只是再转述一遍官方的解释感觉也没有多大意义,不管怎样都是官方的更值得看,或者是其他更为规范的译文总结,这里只是聊聊我所理解的Spring及Spring boot在做什么。

个人思考,看完图个乐。

Spring出现的契机

从宏观的角度来看,在如今面向对象流行的形式下,java程序的实现其实就是多个接口、类、对象之间不断地交互,尤其是在面向对象的范式对现实世界的业务活动折射下,对象之间的关系变得复杂,耦合度高。

个人认为这样的原因是

在使用面向对象初期的不成熟 ——现实世界是第一人称,而代码业务是上帝视角

面向对象的思想通过类和对象来映射现实世界并由此完成业务的实现,在这个思想提出之后难免会因为不成熟带来一些问题,现实世界的交互关系错综复杂,如果想要通过代码来表达、实现这些关系(通过类和对象实现)就会发现:

通过现实世界的逻辑实现代码会出现各种问题。

在现实世界活动中,每个人控制的角色只有自己(不谈管理什么的,只拿现实世界活动来讲),一个人一整天即使和各种各样的事物打交道都不会出现让人意外的错误(这里的错误类比于代码实现过程中的出现的冲突,你在吃完早餐和商家交易不会出现问题,但是代码业务就可能发生不能实现交易的问题)。

这里的原因在于使用面向对象思想,但是这是人们第一次需要在代码中以上帝视角管理类、接口、对象之间的关系,这和你刚开始玩上帝视角的策略游戏一样(目前对于面向对象思想的使用当然还是可以进一步优化的。)

主要表现在类、接口、对象处于相同的优先级,也就是说将业务的实现各种细节交由它们实现(还是以第一人称的角度去看待所有的类、接口、对象)。

这样表达太过于抽象了,可以将Spring的控制反转思想与此对比,作为实现业务代码的我们来说,我们就是上帝,Spring正是通过容器的思想来整合资源、调度资源的使用。不再是某个类去直接控制调度。这就是从第一人称思想到上帝视角的转变。

描述确实有点不学术,可以理解为以前我们通过类、对象、属性的形式来映射现实活动,之后我们脱离了类、对象,而是通过“实体”的形式来映射现实活动(类、对象、属性依然存在,但是我们不再是把视角放到具体,而是统一使用bean)。二者的区别就在于我们不再是迎合现实世界的逻辑而去构建“代码中的的世界”,而是在面向对象思想的基础上将所有的实体看做一种资源,可以全局使用的、可重复使用的资源。

举个生动形象的例子。21世纪共享思想流行,比如共享单车等等,但是这只是一种初级的共享形态,假如在很多年后出现时空传送技术(别再纠结为什么不直接传送人了,我们就假设只能传送物体),那么到时候共享技术将迎来终极形态,一辆单车可以被全世界任何人使用,这时的单车真正变成了一种资源,不再依附于某人,解除了与人的耦合。
这是怎样一种场景:一个塑料袋、一个纸盒,所有参与到现实活动中的非一次性物品像水一样真正成为了一种资源,脱离了现实活动的约束而存在。

这样来看,作为“代码中的世界”,我们具有的操控能力更加强大,我们可以实现让某个实体作为一种资源,抛弃了具体实现中那些不必要的操作(在不同的地方不断的创建、使用、销毁),这就是面向对象思想的使用进阶。

这大概就是IOC的意义,将管理实体的控制权上升一个层次,交给一个造物主,也就是我们的容器,将实体看做一种资源。

代码业务的局部性比现实世界强得多

我认为是IOC实现的重要原因:从上面的共享单车的例子中可以获得解释,个人认为在代码业务中实体(各种对象)的使用频率较高时就需要将它作为一种资源抽离出来交由容器管理:

  • 提高花销与性能的转化比(进一步减少创建资源、销毁资源这些与业务功能无关的花销)
  • 减少耦合,资源本身脱离具体业务细节,就可以与其他资源减少耦合(依赖注入)

总结文 实体是一种资源,服务是一种资源

程序世界走在人类社会前面

人类社会

人类生存的过程中需要两样东西:

一个是实体资源
一个是服务资源

这也是我们常说的实体消费和服务消费。

但是人类社会目前处于的阶段在于:

实体资源依附于人,无法共享(只针对可以共享的来看)
服务消费受限于人类活动,无法共享。

实体资源无法共享的例子正如我们上面所说到的单车,它还没有达到一个全球可共享的阶段(虽然很可笑,但是我认为是可以实现的)
服务资源,比如理发、网吧、火锅店,它们都受限于人类活动,最精明的商家一定是要尽可能把它开到客户流量最多的地方,因为地域限制(想象一下未来具有了时空传送技术,即使把火锅店开到最偏僻的乡村又怎么样,没有了空间限制,看着乡村的美景吃着火锅更具有吸引力)。服务资源不仅仅限制于你能想到的这些服务,只要对于一个实体所做的事具有意义并且较为普遍,都是一种服务资源。

程序世界

程序世界的好处在于,完全没有这些限制。

IOC的意义就是对实体资源的进一步开发
那么服务资源是否需要进一步开发呢? 个人认为AOP的意义就在这里,一种需求:某种业务服务的对象是所有的service或者是比较多的service。比如Spring事务,当我们需要对所有srevice进行事务管控,这样一种服务将它一一注入到每个service中进行处理是不明智的,需要一种新的策略。这就是AOP。

Spring及Springboot IOC与AOP思考相关推荐

  1. Spring核心机制IoC与AoP梳理

    Spring核心机制IoC与AoP梳理 文章目录 Spring核心机制IoC与AoP梳理 IoC介绍 IoC案例介绍 pom文件中IoC环境引入 自己new对象方法举例(正转) IoC创建对象 基于X ...

  2. Spring总结(IOC、AOP原理以及Spring事务)

    一.概述 1.Spring是一个开源免费且轻量级的框架 , 非侵入式的 . 2.控制反转 IoC , 面向切面 Aop 3 .对事物的支持 , 对框架的支持 一句话概括: Spring 是一个轻量级的 ...

  3. Spring 原理初探——IoC、AOP

    前言 众所周知, 现在的 Spring 框架已经成为构建企业级 Java 应用事实上的标准了,众多的企业项目都构建在 Spring 项目及其子项目之上,特别是 Java Web 项目. Spring ...

  4. 谈谈Spring中的IOC和AOP概念 - 倪升武的博客 - CSDN博客

    转载于https://blog.csdn.net/eson_15/article/details/51090040 IOC和AOP是Spring中的两个核心的概念,下面谈谈对这两个概念的理解. 1. ...

  5. spring中的IOC和AOP

    IOC IOC(Inversion Of Controll,控制反转)是一种设计思想,将原本在程序中手动创建对象的控制权,交由给Spring框架来管理.IOC容器是Spring用来实现IOC的载体,I ...

  6. Spring中的IOC和AOP是什么意思?

    (1) Spring是什么? IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AO ...

  7. Spring 面试之IoC 和 AOP

    Spring IoC 什么是IoC Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象 ...

  8. Spring面试,IoC和AOP的理解

    spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦  2.可以使用容易提供的众多服务,如事务管理,消息服务等  3.容器提供单例模式支持  4.容器提供了AOP技术,利用它 ...

  9. BeanPostProcessor —— 连接Spring IOC和AOP的桥梁

    之前都是从大Boss的视角,来介绍Spring,比如IOC.AOP. 今天换个视角,从一个小喽啰出发,来加深对Spring的理解. 这个小喽啰就是, BeanPostProcessor (下面简称 B ...

最新文章

  1. oracle 跑旧的文件,移动datafile以后,旧的datafile是否还被Oracle使用
  2. ubuntu 下mysql导入出.sql文件
  3. 如何全面认识联邦学习
  4. C++中#ifndef/#define/#endif使用详解
  5. 【HIBERNATE框架开发之九】HIBERNATE 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观悲观锁等优化算法)...
  6. 毕业五年的音视频开发工程师过得怎么样了?
  7. 简洁大气好看的个人博客模板HTML源码
  8. i2c总线注意事项和在linux下使用实战
  9. openerp mac os 下 报表中文乱码问题。
  10. 如何使用纯CSS3来生成家谱(family tree)
  11. python3 在线工具_Curl转python在线工具
  12. Word制作学生点名册表格模板
  13. 电子技术部下半学期第一次培训
  14. JavaScript调用Linux系统命令
  15. 服务器虚拟化集群部署
  16. 世界十大OTA公司盘点
  17. linux mysqldump 备份所有数据库,mysqldump导出所有数据库
  18. 2019CBA全明星周末举行正赛 南方明星队获胜
  19. Navicat Premium15 注册出现No all pattern found! file already patched?
  20. 【刷题】LOJ 2863 「IOI2018」组合动作

热门文章

  1. 51单片机使用LCD1602显示DS18B20温度传感器温度
  2. Pentaho Report Designer 教程(一)初识
  3. 爬取网络数据到excel表
  4. 接口开发及技术负责人的职责随笔
  5. 文献解读丨利用群体转录组方法和eQTLs寻找水稻抗病转录因子
  6. css超链接中的下划线设置
  7. 【日志篇】java日志的桥接器和适配器和异步日志
  8. 于typedef的用法总结
  9. 性能功能LocustJmeter LoadRunner优缺点
  10. 卧槽!GitHub标星7.9K star,抢茅台酒脚本竟然开源了!网友:已抢到,真香!