控制反转(Inversion of Control,IoC),是一个比较抽象的概念,它和依赖注入(Dependency Injection, DI)其实差不多,它们两个只是从不同的角度描述相同的概念。
java对象要调用另一个java对象(也称为依赖另一个对象),传统的模式下要用new 来创建被依赖的对象,然后才能使用,这使得java对象之间的耦合度很高,不利于后期代码的升级和维护。——从Spring框架出现后,所有java对象的创建都是由Spring容器完成,并且这些java对象之间都不存在直接的关系,它们都依赖于Spring容器。对象创建的控制权由调用者转移到Spring容器,即控制反转。Spring容器还负责将被依赖对象赋值(即注入)给调用者的成员变量,即依赖注入。
两种注入方式
1.构造方法注入
private TestDIDao testDIDao;
//利用构造方法注入依赖接口对象
public TestDIServiceImp(TestDIDao testDIDao){
this.testDIDao=testDIDao;
}
在Spring配置文件中配置
<bean id="myTestDIDao" class="dao.TestDIDaoImp"/>
<!--Spring 创建Service实现类对象-->
<bean id="myTestDIService" class="service.TestDIServiceImp">
<!--使用构造方法 将myTestDIDao注入到TestDIServiceImp类的TestIDDao成员变量上-->
<constructor-arg index="0" ref="myTestDIDao"/>
</bean>
2.setter方法注入
private TestDIDao testDIDao;
//添加testDIDao属性的setter方法,用于实现注入
public void setTestDIDao(TestDIDao testDIDao){
this.testDIDao=testDIDao;
}
在Spring配置文件中配置
<!--Spring 创建Dao实现类对象-->
<bean id="myTestDIDao" class="dao.TestDIDaoImp"/>
<!--用Spring容器创建TestDIServiceImp对象-->
<bean id="myTestDIService2" class="service.TestDIServiceImp2">
<!--使用setter 将myTestDIDao注入到TestDIServiceImp2类的TestIDDao成员变量上-->
<property name="testDIDao" ref="myTestDIDao"/>
</bean>