spring框架——依赖注入

依赖注入: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中无需修改 我们就能吃到梨子

}
}

猜你喜欢

转载自www.cnblogs.com/yang37/p/10920431.html