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

}
}

spring框架——依赖注入的更多相关文章

  1. 04 Spring框架 依赖注入(一)

    整理了一下之前学习spring框架时候的一点笔记.如有错误欢迎指正,不喜勿喷. 上一节我们讲了几个bean的一些属性,用来限制我们实例创建过后的状态. 但是细心的我们会发现其实上面demo创建的实例并 ...

  2. 07 Spring框架 依赖注入(四)基于注解的依赖注入

    前面几节我们都在使用xml进行依赖的注入,但是在实际的开发中我们往往偏爱于使用注解进行依赖注入,因为这样更符合我们人的思维,并且更加快捷,本节就来讲述Spring基于注解的依赖注入: 信息注入注解 @ ...

  3. 05 Spring框架 依赖注入(二)

    上一节我们讲了三种信息的注入,满足一个类的属性信息的注入,但是如果我们需要向一个实例中注入另一个实例呢?就像我们创建一个学生类,里边有:姓名,性别,年龄,成绩等几个属性(我习惯把类的域叫做属性),但是 ...

  4. 06 Spring框架 依赖注入(三)多配置文件

    在Spring前几节的学习中我们都使用了一个配置文件,就像struts2中可以包含其他的配置文件,我们能不能使用多个配置文件呢(在工程比庞大,配置比较多的时候)? Spring多配置文件分为两种: 平 ...

  5. Spring.NET依赖注入框架学习--实例化容器常用方法

    Spring.NET依赖注入框架学习---实例化容器常用方法 本篇学习实例化Spring.NET容器的俩种方式 1.通过XmlObjectFactory创建一个Spring.NET容器 IResour ...

  6. Spring.NET依赖注入框架学习--简单对象注入

    Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常 ...

  7. Spring.NET依赖注入框架学习--简介

    Spring.NET依赖注入框架学习--Spring.NET简介 概述 Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入. ...

  8. Spring.NET依赖注入框架学习--入门

    Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...

  9. Spring.NET依赖注入框架学习-- 泛型对象的创建和使用

    Spring.NET依赖注入框架学习-- 泛型对象的创建和使用 泛型对象的创建方法和普通对象是一样的. 通过构造器创建泛型对象 下面是一个泛型类的代码: namespace GenericsPlay ...

随机推荐

  1. SpringBoot-(7)-基于Web,JDBC,MySql,Druid,MyBatis整合创建SpringBoot项目

    1 打开Spring Initializr 如果Project SDK为空,手动指定下JDK SDK路径 2, 填写Group和Artifact 3,选择依赖 选择Web,MySQL,JDBC,MyB ...

  2. 代码空间项目 -- 获取当前时间之前的某一天-Calender类的使用

    Calendar类的静态方法getInstance()可以初始化一个日历对象:Calendar now = Calendar.getInstance(); 1.Calendar的基本用法calenda ...

  3. jmeter之java请求

    通常情况下,推荐使用jmeter之java请求编写一beashell调用java代码(上篇)(推荐)编写Java 请求 有以下优势 脚本易维护 易调试 开发脚本周期短 不过网上扩展java请求文章比较 ...

  4. appcompat_v7出现红叉解决方法

    右键属性,java build path 勾选Android5.5.2

  5. iOS端使用二维码扫描(ZBarSDK)和生成(libqrencode)功能

    如今二维码随处可见,无论是实物商品还是各种礼券都少不了二维码的身影.手机中二维码使用也很广泛,如微信等.正好最近收集总结了下二维码的使用方法 下面介绍一下如何在iOS设备上使用二维码 首先在githu ...

  6. get_extension_funcs 返回某个模块下的所有函数

    array get_extension_funcs ( string $module_name )             (参数必选) 该函数根据 module_name 返回模块内定义的所有函数的 ...

  7. 使用boost库生成 随机数 随机字符串

    #include <iostream> #include <boost/random/random_device.hpp> #include "boost/rando ...

  8. shell---rpm

    [root@master src]# rpm -qpl epel-release-latest-6.noarch.rpm         ##查询该rpm包安装了什么warning: epel-rel ...

  9. java第五天之---方法与数组

    案例一:从键盘输入两个数据,比较大小 import java.util.Scanner;class FunctionTest { public static void main(String[] ar ...

  10. 解决在IE11浏览器上,css样式不起作用的问题

    1.首先下载http://pan.baidu.com/s/1c1DA1Ew并运行; 2.在列表中找到.css双击出现Edit File Type; 3.将MIME Type中改为text/css,点击 ...