聊一聊Spring IOC/DI

IOC直接翻译过来是控制反转。什么是控制反转呢。
控制指的是:创建对象的权力。
反转酯的是:将这个权力从java代码中转交给容器(在spring中容器指的是Bean容器)。
为什么需要控制反转呢,java代码也可以创建对象,为什么要交给容器多此一举呢。
假设一个场景,一个类A被实例化100次,类A中有100个方法。现在,我需要对程序进行变动,将类A改为类B。
这个时候,我们就需要对类A的100个实例化改变,引用的方法名可能也需要改变,这样工作量是非常大的。
为了使引用方法名不需要改变,我们可以使用接口,使类A和类B都使用这个接口,利用多态,保持两者的方法名一致。
方法名的问题解决了,那对类A的100次实例化多态是无法解决的,需要在程序中找出这100个类A实例化的地方,并更改。
这样是一件很麻烦的事情,而且代码的复用性也不高。因此,我们引入了控制反转。
控制反转将创建对象的权力交给容器,容器一般是在xml配置文件中的。
我们在配置文件中通过类的路径创建这个类的对象。

<bean id="a" class="类A的路径"></bean>

上面我们创建了一个类A的对象。在java代码中,我们只需要解析上面这个代码所在的xml文件,通过getBean()就可以获取类A的对象。
这样的话,如果我们需要更改类A为类B,不管类A被实例化多少次,都不需要更改java代码,只需要在xml配置文件中,将类A的路径改成类B的路径。这样就可以完成任务了。

<bean id="a" class="类B的路径"></bean>

通过上面的方法,我们可以创建对象,但是会发现,没有初始化类里面的成员变量,一般情况下,java的类成员变量初始化有两种常用方法:1、有参构造函数。2、setter方法。
那么,通过容器实例化的对象,需要怎么初始化呢?
这时候就用到的DI,即依赖注入。
依赖注入比较官方的说法是:由容器动态的将某个依赖关系注入到组件之中。
在这里,我的理解是:依赖注入是对类的全局变量和全局对象赋值。
继续上面的实例。假设类A有两个成员变量,一个为int类型,一个为类C。现在我们需要对两者初始化。
如何在没有控制反转的情况下,我们对A的成员变量实例化的两个方法:
通过有参构造:

public A(int x,C c)
{
	this.x=x;
	this
}

通过setter方法:

public void setX(int x)
{
	this.x=x;
}
public void setC(C c)
{
	this.c=c;
}

当我们使用控制容器创建对象的时候,就用到了依赖注入。
依赖注入我们常用的两个方法,也是和上面相对应的,同样还是类A;
有参构造器注入:

<bean id="a" class="类A的路径">
	<constructor-arg name="x" value="为x初始化的值"></constructor-arg>
	<constructor-arg name="c" ref="类C的对象的ID"></constructor-arg>
</bean>

通过setter方法:

<bean id="a" class="类A的路径">
	<property name="x" value="为x初始化的值"></property>
	<property name="c" ref="类C的对象的ID"></cproperty>
</bean>

综上,是我对Spring IOC/DI的理解。我觉得IOC/DI最大的意义就是松耦合,方便代码更改,提高代码的复用性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值