在Spring中IOC(控制反转)是通过使用DI(依赖注入)设计默认实现的,那么什么是依赖注入呢,所谓依赖注入即是指将调用类对接口实现类的依赖关系由第三方注入,
取消调用类对接口实现类的依赖关系。通过一个简单的例子来帮助我们理解依赖注入。
首先定义一个接口,里面只有一个QuizMaster方法
package com.zcl.spring.di;
public interface QuizMaster {
public String popQuestion() ;
}
然后我们定义两个类实现popQuestion方法,一个是StrutsQuizMaster类,一个是SpringQuizMaster类:
package com.zcl.spring.di;
public class StrutsQuizMaster implements QuizMaster{
@Override
public String popQuestion() {
return "Are you new to Struts?";
}
}
package com.zcl.spring.di;
public class SpringQuizMaster implements QuizMaster{
@Override
public String popQuestion() {
return "Are you new to Spring?";
}
}
我们在新建一个QuizMasterService类,他持有QuizMaster的引用,显示信息给用户。
package com.zcl.spring.di;
public class QuizMasterService {
private QuizMaster quizMaster ;
public void setQuizMaster(QuizMaster quizMaster){
this.quizMaster = quizMaster ;
}
public void askQuestion(){
System.out.println(quizMaster.popQuestion()) ;
}
}
现在我们就需要使用容器来注入相关的值,beans.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans">
<bean id="springQuizMaster" class="com.zcl.spring.di.SpringQuizMaster"></bean>
<bean id="strutsQuizMaster" class="com.zcl.spring.di.StrutsQuizMaster"></bean>
<bean id="quizMasterService" class="com.zcl.spring.di.QuizMasterService">
<property name="quizMaster">
<ref local="strutsQuizMaster"/>
</property>
</bean>
</beans>
现在我们来通过QuizProgram测试一下。
package com.zcl.spring.di;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class QuizProgram {
public static void main(String args[]){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml") ;
QuizMasterService quizMasterService = (QuizMasterService)context.getBean("quizMasterService") ;
quizMasterService.askQuestion() ;
}
}
执行结果:
Are you new to Struts?
也就是说我们可以通过第三方xml文件来为我们的调用接口类进行实例话,这就增加了代码的灵活性,如果现在我们希望的是SpringQuizMaster,那么我们只需要修改下beans.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans">
<bean id="springQuizMaster" class="com.zcl.spring.di.SpringQuizMaster"></bean>
<bean id="strutsQuizMaster" class="com.zcl.spring.di.StrutsQuizMaster"></bean>
<bean id="quizMasterService" class="com.zcl.spring.di.QuizMasterService">
<property name="quizMaster">
<ref local="springQuizMaster"/>
</property>
</bean>
</beans>
执行行的就是SpringQuizMaster实现的方法。下面是注入值的框架图。
从图上显然很容易看出相应的关系。