2.1、IOC容器和Bean的介绍

了解IOC容器之前,先了解什么是bean

一、什么Bean

        在 Spring 中,构成应用程序主干并由Spring IOC容器管理的对象称为Bean。Bean是一个由Spring IOC容器实例化、组装和管理的java对象。

        简单来说Bean就是java对象,再直白点说,就是我们new XXX(),创建了一个对象,在堆中占用一定的内存的这个玩意。

        Bean一直以来都是我们在类中需要用到的时候,自己创建的。现在这个Bean的创建与管理,统一由spring的IOC容器接管(其实这就是IOC的思想)。

总结一句话,Bean就是java对象。

二、IOC容器

        在基于spring的应用中,你的应用对象(即引用或叫组件,其实就是Bean)生存于spring容器(coantainer)中。如下图,spring容器负责创建对象,装配它们(就是关联Bean之间的关系),配置它们并管理它们的整个生命周期,从创建到死亡。Bean的生命周期在下面。

        容器是spring的核心,spring容器使用DI(依赖注入)管理构成应用的组建,它会创建相互协作的组织之间的关联。

        简单点来说,容器就是Bean创建,生存,销毁的地方。容器会负责组建这些Bean之间的联系。我们需要用Bean只需要从这里拿,不需要自己创建。

        或者可以理解为,容器就是Bean的租赁工厂,我们的程序需要了就去拿,用完了就还。不用关心Bean从哪里来,又到哪里去,它是否需要去管理。这不用你关心,这是spring容器的工作。

三、IOC底层原理

xml/注解+工厂设计模式+反射 

四、为什么使用IOC

        你可以想象一下,假如当年设计鼠标键盘的人直接焊在电脑主板芯片上,没有鼠标就主板就废了启动不了,鼠标出现问题导致主板出现问题,外设坏了想换要拆开重新焊一个上去,这样的扩展性,可维护性多差! 所以设计者提供一个接口出来可以接受不同的外设?并且让外设变成可插拔?

        每次鼠标坏了需要拆开电脑,重新焊一个鼠标上去。导致代码的变更巨大,任何的变更都会加大造成系统BUG的可能性。

UserDaoImpl dao=new UserDaoImpl();

1、接口分离原则ISP(the Interface Segregation Principle ISP)

        模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来,不要将鼠标(具体实现)直接焊在主板上,使用插口(抽象)连接;

        现在接口有了,但是无法热插拔。 每次鼠标坏了需要关掉电脑才能更换(实现类换了还是需要去变更代码)

IUserDao dao=new UserDaoImpl();

2、依赖倒置原则DIP(the Dependency Inversion Principle DIP)

        具体实现依赖抽象,下层依赖上层,进行分离

        依赖倒置原则使鼠标、键盘和电脑成为独立的的互不相干的对象,当电脑(上层)没有鼠标可以正常启动但是鼠标(下层)没有电脑则一无是处 ,控制权就被反转了(IOC)。 所以鼠标需要依赖USB(DI)才能使用。

之前——正转: 主板---焊接--->鼠标 电脑没有鼠标则无法启动

现在——反转: 电脑

IOC是DI的设计原理,DI是IOC的具体实现

鼠标坏了很快就可以换一个,虽然会涉及短暂无法使用, 但是产生的变更极少。

IUserDao dao=从ioc种获取,涉及到的代码变更极少。

五、IOC优点

  • 集中管理
  • 功能可复用(减少对象的创建和内存消耗)
  • 使得程序的整个体系结构可维护性、灵活性、扩展性变高
  • 解耦

再举个例子:

        在面向对象设计的软件系统中,底层的实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。

        有一个对象出了问题,就可能会影响到整个流程的正常运转。现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。

        大家看到了吧,由于引进了中间位置的“第三方”,也就是IOC容器,对象和对象之间没有了耦合关系, 它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。

        通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

六、IOC分析  

IOC(Inversion of Control)控制反转

        所谓IOC,对于spring框架来说,IOC只能说是一种思想,就是由spring来负责控制对象的生命周期和对象之间的关系,最终还是表现在上面所说的容器上。

A:控制:控制的双方是什么?谁控制谁?

        主控方:Spring

        被控方:Bean(java对象,应用程序所使用的资源)

        原始-----应用程序控制自己执行操作需要使用的外部资源(程序自己创建自己需要的Bean)

        Spring-----Spring控制整个程序中所需要使用的外部资源(统一由ioc容器创建,管理)

B.反转:什么是反转?反转什么?

        正向:应用程序直接调用资源

        反向:应用程序依赖Spring为其提供资源

        反转的是资源的控制权

        应用程序由主动调用资源,变为被动的等待Spring提供资源(程序只需要声明一个引用,等待容器的依赖注入即可)

        控制反转简单来说就是,平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。

        再简单点来说,我们的程序不需要自己做饭(Bean对象)往自己的碗(应用程序)里盛,而是我们只用端个碗(应用程序),同时声明一下我需要啥饭(Bean对象),然后spring容器自动会给我们注入这个Bean资源。

C.有什么好处?

        正向缺点:应用程序控制的资源分布在程序的每一个地方(在哪里用就在哪里new)

        反向的优点:所有的资源都在Spring中,便于管理

总结:Spring反向控制应用程序所需要使用的外部资源。资源受Spring管理,利用率最大化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值