如果只是再转述一遍官方的解释感觉也没有多大意义,不管怎样都是官方的更值得看,或者是其他更为规范的译文总结,这里只是聊聊我所理解的Spring及Spring boot在做什么。
个人思考,看完图个乐。
Spring出现的契机
从宏观的角度来看,在如今面向对象流行的形式下,java程序的实现其实就是多个接口、类、对象之间不断地交互,尤其是在面向对象的范式对现实世界的业务活动折射下,对象之间的关系变得复杂,耦合度高。
个人认为这样的原因是
在使用面向对象初期的不成熟 ——现实世界是第一人称,而代码业务是上帝视角
面向对象的思想通过类和对象来映射现实世界并由此完成业务的实现,在这个思想提出之后难免会因为不成熟带来一些问题,现实世界的交互关系错综复杂,如果想要通过代码来表达、实现这些关系(通过类和对象实现)就会发现:
通过现实世界的逻辑实现代码会出现各种问题。
在现实世界活动中,每个人控制的角色只有自己(不谈管理什么的,只拿现实世界活动来讲),一个人一整天即使和各种各样的事物打交道都不会出现让人意外的错误(这里的错误类比于代码实现过程中的出现的冲突,你在吃完早餐和商家交易不会出现问题,但是代码业务就可能发生不能实现交易的问题)。
这里的原因在于使用面向对象思想,但是这是人们第一次需要在代码中以上帝视角管理类、接口、对象之间的关系,这和你刚开始玩上帝视角的策略游戏一样(目前对于面向对象思想的使用当然还是可以进一步优化的。)
主要表现在类、接口、对象处于相同的优先级,也就是说将业务的实现各种细节交由它们实现(还是以第一人称的角度去看待所有的类、接口、对象)。
这样表达太过于抽象了,可以将Spring的控制反转思想与此对比,作为实现业务代码的我们来说,我们就是上帝,Spring正是通过容器的思想来整合资源、调度资源的使用。不再是某个类去直接控制调度。这就是从第一人称思想到上帝视角的转变。
描述确实有点不学术,可以理解为以前我们通过类、对象、属性的形式来映射现实活动,之后我们脱离了类、对象,而是通过“实体”的形式来映射现实活动(类、对象、属性依然存在,但是我们不再是把视角放到具体,而是统一使用bean)。二者的区别就在于我们不再是迎合现实世界的逻辑而去构建“代码中的的世界”,而是在面向对象思想的基础上将所有的实体看做一种资源,可以全局使用的、可重复使用的资源。
举个生动形象的例子。21世纪共享思想流行,比如共享单车等等,但是这只是一种初级的共享形态,假如在很多年后出现时空传送技术(别再纠结为什么不直接传送人了,我们就假设只能传送物体),那么到时候共享技术将迎来终极形态,一辆单车可以被全世界任何人使用,这时的单车真正变成了一种资源,不再依附于某人,解除了与人的耦合。 这是怎样一种场景:一个塑料袋、一个纸盒,所有参与到现实活动中的非一次性物品像水一样真正成为了一种资源,脱离了现实活动的约束而存在。
这样来看,作为“代码中的世界”,我们具有的操控能力更加强大,我们可以实现让某个实体作为一种资源,抛弃了具体实现中那些不必要的操作(在不同的地方不断的创建、使用、销毁),这就是面向对象思想的使用进阶。
这大概就是IOC的意义,将管理实体的控制权上升一个层次,交给一个造物主,也就是我们的容器,将实体看做一种资源。
代码业务的局部性比现实世界强得多
我认为是IOC实现的重要原因:从上面的共享单车的例子中可以获得解释,个人认为在代码业务中实体(各种对象)的使用频率较高时就需要将它作为一种资源抽离出来交由容器管理:
- 提高花销与性能的转化比(进一步减少创建资源、销毁资源这些与业务功能无关的花销)
- 减少耦合,资源本身脱离具体业务细节,就可以与其他资源减少耦合(依赖注入)
总结文 实体是一种资源,服务是一种资源
程序世界走在人类社会前面
人类社会
人类生存的过程中需要两样东西:
一个是实体资源 一个是服务资源
这也是我们常说的实体消费和服务消费。
但是人类社会目前处于的阶段在于:
实体资源依附于人,无法共享(只针对可以共享的来看) 服务消费受限于人类活动,无法共享。
实体资源无法共享的例子正如我们上面所说到的单车,它还没有达到一个全球可共享的阶段(虽然很可笑,但是我认为是可以实现的) 服务资源,比如理发、网吧、火锅店,它们都受限于人类活动,最精明的商家一定是要尽可能把它开到客户流量最多的地方,因为地域限制(想象一下未来具有了时空传送技术,即使把火锅店开到最偏僻的乡村又怎么样,没有了空间限制,看着乡村的美景吃着火锅更具有吸引力)。服务资源不仅仅限制于你能想到的这些服务,只要对于一个实体所做的事具有意义并且较为普遍,都是一种服务资源。
程序世界
程序世界的好处在于,完全没有这些限制。
IOC的意义就是对实体资源的进一步开发 那么服务资源是否需要进一步开发呢? 个人认为AOP的意义就在这里,一种需求:某种业务服务的对象是所有的service或者是比较多的service。比如Spring事务,当我们需要对所有srevice进行事务管控,这样一种服务将它一一注入到每个service中进行处理是不明智的,需要一种新的策略。这就是AOP。
|