依赖注入:DI 又称控制反转:IoC
项目名字spring_DI

一、implement包中定义了两个接口Food和Person
1.接口Food
package org.interfaces;
public interface Food {
	public String eat();   //food接口有被吃的方法待实现
}
2.接口Person
package org.interfaces;
public interface Person {
		public void eatFood();  //人接口有吃东西的方法待实现
}
二、.这两个接口有对应的实现类来实现其中的方法
1.Food实现类Apple
package org.interfaces.impl;
import org.interfaces.Food;
public class Apple implements Food{
	public String eat() {
		return "eating apple";  //实例化food 指明了是吃苹果
	}
}
2.Person实现类Man
package org.interfaces.impl;
import org.interfaces.Food;
import org.interfaces.Person;
public class Man implements Person{
	private Food food;
	
	public void setFood(Food food) {
		this.food = food;
	}
	
	public void eatFood() {
		System.out.println(food.eat()); 
	}
}
三、配置文件
 <bean id="man" class="org.interfaces.impl.Man"> //bean id形象点 class指明这个注入用在哪里
			<property name="food">  //food是Food接口类型对应的变量
				<ref bean="apple"/>		//ref元素表示引用   引用其他bean的值
			</property>
		</bean> 
		<bean id="apple" class="org.Interface.impl.Apple"> </bean>  //food接口的实现类在哪
四、编写测试类Test
package org.test;
import org.interfaces.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Test {
	public static void main(String args[]){
		ApplicationContext context =new FileSystemXmlApplicationContext("src/applicationContext.xml");
		Person p = (Person)context.getBean("man");
		p.eatFood();
	}
}
关于以上代码的理解
package org.interfaces.impl;
import org.interfaces.Food;
import org.interfaces.Person;
public class Man implements Person{
	private Food food;
	public void setFood(Food food) {
		this.food = food;
	}
	public void eatFood() {
		System.out.println(food.eat()); 
 
//		人接口实例化对象Man
//		food是接口啊  接口相当于一份图纸 得造出来实际的东西才能用这个东西拥有的方法啊 怎么能直接使用eat()方法呢?
		
		//下面是spring中的配置  无非就是指明Food接口的实现类为Apple
//		<bean id="man" class="org.interfaces.impl.Man">  //bean id形象点    class指明对应的类
//			<property name="food">  //food是Food接口类型对应的变量 Man中的food没有指明对应的实现类
//	  			<ref bean="apple"/>		//ref元素表示引用   引用其他bean的值 表示food接口的实现类去问那个叫apple的bean
//			</property> 
//		</bean> 
//		<bean id="apple" class="org.Interface.impl.Apple"> </bean>  //food接口的实现类在哪
		
		//这个bean就指明了Food接口的实现类是Apple  注意上面的food不是接口名 是作为一个变量来接收实例化对象
		
		//1.在bean中指明了对food属性注入 即name="food"
		//2.注入的值为 apple
		//3.所以我们可以理解为  当需要实例化的对象来使用eat()方法时
		//  spring帮忙创造了这个接口的实例化对象apple 这个过程是自动的
		//问:有写food的实例化对象apple啊 为嘛我们不直接apple.eat
		//		如果要apple.eat
		//         food = new Apple();
		//		   System.out.println(food.eat());
		//		是不是就要new一个apple?这样我们人的实例Man就与Apple绑定在了一起  产生耦合
		//		利用spring 我们可以再写一个实现类Pear 这样Man中无需修改 我们就能吃到梨子
}
}
原文:https://www.cnblogs.com/yang37/p/10920431.html