最简明的Spring的IoC原理解释

最简明的Spring的IoC原理解释

如果大家进行Java企业级开发,Spring是肯定不可能忽略的存在。网上已经有一大堆介绍Spring的教程和文章了。为什么还要写一篇这样的文章呢?我觉得毕竟还是有很多的新手开始接触Java企业应用编程,通过这篇文章能够快速理解Spring的基本思想和概念,少走弯路。对于有经验的开发者,也能够给大家提供一个更加接近Spring原始动机和核心思想的解释。

How to Count Jelly Beans in a Jar

介绍开始,我们先上图。这是一个容器(container),中间装了很多糖豆(beans)。好了,Spring要做的事情已经用图片说明啦…还没理解。那就继续详细介绍吧。对于一个典型的企业级应用通常都有哪些必不可少的部分呢?当时数据啦,基本上绝大多数的企业系统(ERP,CRM,MES,企业网站…)都是围绕数据展开的。而这些数据大多数都是存放在数据库中的,当然有关系型数据库,NonSql数据库以及其他的数据存储形式。

对于典型的面向对象编程,我们应该将程序中的各种东西抽象成对象。对于数据来说,通常需要将数据库中的数据对应到一个对象中,称为数据对象。使用的时候就要通过数据库访问获取数据并生成对象的实例。一个应用程序在运行时往往会创建多个数据的实例。另外,在一个企业应用中除了数据以外,我们还需要业务逻辑对数据进行处理,并且能够利用这些数据完成功能。比如根据用户信息,提供某个功能的访问权限。用户信息会根具User Class做为模板,创建一个数据实例。那么业务逻辑也应该抽象成对象(Java中就是一个类)提供功能,访问用户信息并确定该用户能否访问,最后给到访问权限。而这种业余逻辑对象在SOA这样的架构中会抽象成一个Service,我们称这种对象是业务对象,主要提供处理数据的功能。这种对象在一个程序中通常只需要创建一个就可以,在最早期不使用框架的情况下,我们处理这样的这能创建一个实例的问题是,往往采用Singleton模式处理。

在SSM(Spring,Spring MVC和Mybatis)中,上述的两类对象,分别由不同的框架进行处理。业务对象,通过Spring IOC容器(Spring IOC Container)进行处理。数据对象则采用ORM框架Mybatis进行处理。对这里,我们其实就引出了Spring最重要的功能,作为一个容器(Container),装各种(bean)。这些Bean叫做Spring Beans,其实就是各种业务对象实例。Spring框架采用了比较精巧的方式(IOC)控制反转来处理容器创建,使用和销毁的整个生命周期。如下图所示这些实例Bean都在Spring容器的管理下。

屏幕截图 2022-08-11 234552

Spring不是仅仅创建和管理这些业余逻辑层的对象(beans)。如果仅仅只做到这一步,那Spring和堆Singleton对象的管理工具没啥两样。Spring最出彩的地方就是通过依赖注入(Dependency Injection)实现了控制反转(IOC)。

什么是IOC,什么是DI呢?这个是Spring框架的核心,也往往是最容易让初学者迷糊的地方。其实我们通过面向对象的基本概念就很容易理解。面对像编程的一个最重要原则就是低耦合,高内聚。同一个对象功能要集中,但是不同对象的耦合性要求尽量减少。这样修改程序的时候,我们就只需要专注于真正和功能相关的那个对象。我们知道在一个程序中,不同的对象不可能都是独立的,对象和对象之间肯定有调用的关系。比如业务系统中的订单对象需要调用客户对象中的方法来获取订单客户的地址和收货方式等信息。这其实就存在两个对象的关联性,对象的关联性如下图示例所示,有一个画圆的对象和一个画三角的对象,application对象同时调用了这两个对象的draw方法,用于绘制圆和三角两个图形。创建实例时用了new去创建对象。

屏幕截图 2022-08-12 000632

当然,我们可以用一个父类Shape作为Circle和Triangle的父类,形成下图的的对象调用方式:

上面这种方式其实并没有什么本质的变化,我们其实还是要在Application这个类中去创建Shape对象。创建对象实例的任务,总是交给调用这个对象的实例来完成。这就是一般的对象创建“控制方式”。调用方控制被调用方的实例创建。下面我们引入了Drawing这个类,在这个类中我们将Shape类作为一个属性,通过setter方法注入(inject)到这个类中去,就能够直接调用里面的draw方法了。这就是依赖注入的核心基本思想所在。

屏幕截图 2022-08-12 002608

在Spring框架中,Spring会读取配置文件中的依赖项,在Spring容器中管理这些提前生成的Instance。在程序中需要使用这些对象的时候,就会通过setter注入到使用的类中。如果在生成类的时候用不同的shape,我们可以在配置文件中通过设置不同的ref来实现。而不需要线式地去创建或者指定对象类型,而是同过Spring容器来处理这些对象依赖关系,直接注入到对象中去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rocky-Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值