zoukankan      html  css  js  c++  java
  • Spring中的依赖注入(1)

    可以看新写的第2版:https://www.cnblogs.com/yang37/p/12811265.html

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

    }
    }

  • 相关阅读:
    hibernate 字段名最好不要使用数据库的保留字
    Tomcat Java内存溢出 PermGen space 解决方案
    jsp关于include html、jsp等文件出现乱码问题的解决方案
    hibernate annotation注解 columnDefinition用法
    hibernate annotation注解 主键ID自增长
    Java将整个文件夹里的文本中的字符串替换成另外一个字符串(可用于项目复制,变成另一个项目)
    FreeMarker 乱码解决方案 生成静态html文件
    Java发送post请求
    编程式导航
    vue-router 的重定向-redirect
  • 原文地址:https://www.cnblogs.com/yang37/p/10920431.html
Copyright © 2011-2022 走看看