spring框架——依赖注入

Posted yang37

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中的配置 无非就是指明接口的实现类为Apple
// <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接口的实现类在哪

//这个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中无需修改 我们就能吃到梨子
}
}

 

以上是关于spring框架——依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

框架----Spring中依赖注入

Spring框架Spring依赖注入DIBean作用域Bean的自动装配

类比Spring框架来实现OC中的依赖注入

spring中依赖注入的原理

框架学习 Spring之依赖注入DI

Spring 依赖注入原理