2-IOC

2-IOC

概念

​ 控制反转(IOC),是一种概念,一种思想。指将传统上由程序代码直接操纵的对象的调用权交给容器,通过容器来实现对象的装配和管理。控制反转指的就是 对对象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建、属性赋值、依赖的管理。

IOC是一种思想,它的实现方法有很多,比较流行的是依赖注入(Dependency Injection) ,也叫DI,应用广泛。

如何理解IOC(截取知乎上一篇文章的核心部分):

ioc的思想最核⼼的地⽅在于,资源不由使⽤资源的双⽅管理,⽽由不使⽤资源的第三⽅管理,这
可以带来很多好处。第⼀,资源集中管理,实现资源的可配置和易管理。第⼆,降低了使⽤资源
双⽅的依赖程度,也就是我们说的耦合度。
也就是说,甲⽅要达成某种⽬的不需要直接依赖⼄⽅,它只需要达到的⽬的告诉第三⽅机构就可
以了,⽐如甲⽅需要⼀双袜⼦,⽽⼄⽅它卖⼀双袜⼦,它要把袜⼦卖出去,并不需要⾃⼰去直接
找到⼀个卖家来完成袜⼦的卖出。它也只需要找第三⽅,告诉别⼈我要卖⼀双袜⼦。这下好了,
甲⼄双⽅进⾏交易活动,都不需要⾃⼰直接去找卖家,相当于程序内部开放接⼝,卖家由第三⽅
作为参数传⼊。甲⼄互相不依赖,⽽且只有在进⾏交易活动的时候,甲才和⼄产⽣联系。反之亦
然。这样做什么好处么呢,甲⼄可以在对⽅不真实存在的情况下独⽴存在,⽽且保证不交易时候
⽆联系,想交易的时候可以很容易的产⽣联系。甲⼄交易活动不需要双⽅⻅⾯,避免了双⽅的互
不信任造成交易失败的问题。因为交易由第三⽅来负责联系,⽽且甲⼄都认为第三⽅可靠。那么
交易就能很可靠很灵活的产⽣和进⾏了。这就是ioc的核⼼思想。⽣活中这种例⼦⽐⽐皆是,⽀付
宝在整个淘宝体系⾥就是庞⼤的ioc容器,交易双⽅之外的第三⽅,提供可靠性可依赖可灵活变更
交易⽅的资源管理中⼼。另外⼈事代理也是,雇佣机构和个⼈之外的第三⽅。
=update=
在以上的描述中,诞⽣了两个专业词汇,依赖注⼊和控制反转所谓的依赖注⼊,则是,甲⽅开放
接⼝,在它需要的时候,能够讲⼄⽅传递进来(注⼊)所谓的控制反转,甲⼄双⽅不相互依赖,交易
活动的进⾏不依赖于甲⼄任何⼀⽅,整个活动的进⾏由第三⽅负责管理。

什么是依赖

classA中有classB的实例,那么在classA中调用classB的方法完成实例,那么classA对classB有依赖。

依赖注入:是指,在程序运行过程中,若需要调用另一个对象协助时,无须再代码中创建,而是依赖于外部容器,由外部容器创建后传递给程序。

Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对象之间依赖关系的管理。

IOC的另一个体现是在使用Servlet时,没有创建过Servlet对象,而是由Tomcat来创建,所以也叫Tomcat容器。

创建对象

在spring中,把Java对象叫做bean。

在使用maven管理项目时,在main目录下,创建resources目录,在该目录下创建spring的配置文件beans.xml。

在这个配置文件中,配置spring需要创建的类对象。格式为:

1
<bean id="" class="" />

声明bean,就代表告诉spring创建某个类的对象,id是该对象的自定义名称,是唯一值,spring通过id找到这个对象;

一个bean标签声明一个对象。

这种设置下,spring创建对象调用的是类的无参数构造器,所以如果要想让spring自动创建某个类的对象,该类必须有无参数构造器。后面会学到,添加标签和属性,spring可以调用有参构造器。

class是对应类的全限定名称(不能是接口,只能是类)。

在spring框架中,有一个map,存放创建的对象,key和value分别是id和创建的对象。

例如有一个org.example.Test类,要让Spring去自动创建它,在配置文件beans.xml中应这样写:

<bean id="test" class="org.example.Test" />

创建容器对象ApplicationContext

spring帮我们创建好对象后,我们要使用ApplicationContext来获取对象,进行使用,它就表示spring容器。ApplicationContext是一个接口,最常用的实现类是ClassPathXmlApplicationContext,创建该类对象时有一个参数,是配置文件的路径。

1
2
String config = "beans.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
image-20201024172618382

这是例子项目的目录结构,beans.xml在resources目录下,在编译后,会在classes目录下,也就是类的根目录,所以变量config直接写"beans.xml"即可。

在创建ApplicationContext时,读取beans.xml文件时当读取到一个bean标签,就会创建一个对象。

然后使用该对象的getBean()方法来获取要使用的对象。该方法有多种重载形式,可以使用对象id作为参数来获取对象。并进行类型强制转换。

这种方法在后面慢慢就不会使用,但刚开始需要这样来获取。

使用容器对象获取对象信息

可以使用ApplicationContext的方法来获取对象信息

获取创建的对象数量

使用getBeanDefinitionCount()方法来获取,返回值是int类型

获取创建对象的名称(ID)

使用getBeanDefinitionNames()来获取,返回值是String数组


2-IOC
https://zhaoquaner.github.io/2022/05/11/Spring/2-IOC/
更新于
2022年5月22日
许可协议