一、我们所想的容器
首先,我们第一反应那就应该是可以用来装载东西的物品才可应用来称之为容器
,当让要只是这么想的话,那这个容器也就只能是用来装载东西,用途太过于单一了,其实Spring所想的容器在我们想的容器基础上加了很多附加功能;
下面贴一张百度百科对于容器的定义
二、Spring所想的容器
以我的理解Spring的容器:
可以用来装载最基本的组件(一系列的Bean)
对装载的东西进行生到死的管理(生命周期)
组装组件的各个部件(属性值,加载方式)
三、容器理念的落地IOC
Spring中接口org.springframework.context.ApplicationContext代表着IOC容器并且负责实例化,配置和组装上述的beans。该容器使它的指令通过读取配置元数据作用于哪些对象去初始化,配置和组装。配置元数据表现在XML,Java注解或Java代码中。它允许您表达组成应用程度的对象以及这些对象之间的丰富的依赖性。
下面看一下Spring容器的继承图:
四、IOC与DI
4.1 IOC(控制反转)
使用者之前使用B对象的时候都需要自己去创建和组装,而现在这些创建和组装都交给spring容器去给完成了,使用者只需要去spring容器中查找需要使用的对象就可以了;这个过程中B对象的创建和组装过程被反转了,之前是使用者自己主动去控制的,现在交给spring容器去创建和组装了,对象的构建过程被反转了,所以叫做控制反转;IOC是是面相对象编程中的一种设计原则,主要是为了降低系统代码的耦合度,让系统利于维护和扩展
上面应该是说的很清楚了,就是以前自己要用的对象要自己去new现在使用Spring的话这一切就不需要自己去new而是直接去Spring容器中拿就行,只需适当的配置就行。
关联知识:依赖倒置原则(Dependency Inversion Principle )
什么是依赖倒置原则:假设我们设计一辆汽车:先设计轮子,然后根据轮子大小设计底盘,接着根据底 盘设计车身,最后根据车身设计好整个汽车。这里就出现了一个“依赖”关系:汽车依赖车身,车身依赖 底盘,底盘依赖轮子、
**上图看上去没有什么毛病但是 万一轮胎尺寸改了,那么地盘需要改,地盘改了,车身也改了,让后整个汽车构造都改了,然后汽车公司倒闭了… **
董事长依赖总经理争取,总经理依赖部门经理挣钱,部门经理依赖员工争取,那么员工离职了怎么办?????????????????
反过来…假如汽车公司决定修改轮胎的 我们就只需要改动轮子的设计,而不需要动底盘,车身,汽车 的设计了。
IOC容器的最最最最核心思想
ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。
- 资源集中管理,实现资源的可配置和易管理。
- 降低了使用资源双方的依赖程度,也就是我们说的耦合度
看下面图解:
4.2 DI(依赖注入)
依赖注入是spring容器中创建对象时给其设置依赖对象的方式,比如给spring一个清单,清单中列出需要创建B对象以及其他的一些对象(可能包含了B类型中需要依赖对象),此时spring在创建B对象的时候,会看B对象需要依赖于哪些对象,然后去查找一下清单中有没有包含这些被依赖的对象,如果有就去将其创建好,然后将其传递给B对象;可能B需要依赖于很多对象,B创建之前完全不需要知道其他对象是否存在或者其他对象在哪里以及被他们是如何创建,而spring容器会将B依赖对象主动创建好并将其注入到B中去,比如spring容器创建B的时候,发现B需要依赖于A,那么spring容器在清单中找到A的定义并将其创建好之后,注入到B对象中。
其实这个也好理解,我来举个例子哈!
还是上面租房子的案例:
首先我要找一间房子住,要求:
- 价格便宜
- 交通便利
- 独卫带厨房
- 家具齐全
- 带网线通网
将这些要求给中介
接着中介根据这些要求去检索(Spring中是根据定义创建对应实例)这类房子
然后发现这房子需要通网(依赖)中介就联络相关营业厅通网
所有要求满足之后就将房子给租客完成客户租房过程
其中租客第五个要求就是需要依赖注入的要中介通过相关的营业厅完成租客的要求
结束语
- 由于博主才疏学浅,难免会有纰漏,假如你发现了错误或偏见的地方,还望留言给我指出来,我会对其加以修正。
- 如果你觉得文章还不错,你的转发、分享、点赞、留言就是对我最大的鼓励。
- 感谢您的阅读,十分欢迎并感谢您的关注。