Spring 学习笔记02

依赖注入

依赖注入的方式主要有两种,setter注入和构造器注入

1.setter注入

setter注入指的是通过成员变量的setter方法来注入被依赖的对象

首先定义两个接口:

public interface People {
    void drinkWater();
}
public interface Water {
    String makeDrink();
}

定义实现类

public class Tea implements Water{

    public String makeDrink() {
        
        return "开始泡茶";
    }
    
}
public class Chinese implements People{

    private Water  water;

    public void setWater(Water water) {
        this.water = water;
    }

    public void drinkWater() {
        System.out.println(water.makeDrink());
        System.out.println("中国人喜欢喝茶");
    }
    
}

配置文件中配置并注入bean

    <bean id="chinese" class="com.huan.example.Chinese">
        <property name="water" ref="Tea"></property>
    </bean>
    
    <bean id="Tea" class="com.huan.example.Tea">
    </bean>

测试:

public class TestPeople {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        Chinese chinese = ac.getBean("chinese", Chinese.class);
        chinese.drinkWater();
    }
}

结果:

image

Spring会自动检测<bean>元素中的<property>标签,在Spring调用默认的构造器创建Bean的实例之后会立刻调用对应的setter方法为Bean的

成员变量注入值。

2.构造注入

构造注入值的是在利用类的构造器构造实例时,对依赖的值进行注入,标签元素为<construct-arg../>

更改上面的Chinese实现类的代码以及配置文件

public class Chinese implements People{

    private Water  water;

    public Chinese(Water water){
        this.water = water;
    }
    
//    public void setWater(Water water) {
//        this.water = water;
//    }

    public void drinkWater() {
        System.out.println(water.makeDrink());
        System.out.println("中国人喜欢喝茶");
    }
    
}
    <bean id="chinese" class="com.huan.example.Chinese">
        <!-- <property name="water" ref="Tea"></property> -->
        <!-- 其他属性 index 代表构造器第几个参数   type 指定参数的类型-->
        <constructor-arg ref="Tea" />
    </bean>
    <bean id="Tea" class="com.huan.example.Tea">
    </bean>

使用测试类运行:

image

结果和set注入一致,构造注入和setter注入的主要区别在于:setter注入是先通过无参数的构造器创建一个Bean的实例,

然后调用对应的setter方法注入依赖关系,而构造器注入则直接调用有参数的构造器,当Bean实例创建完成后已经完成了

依赖关系的注入。

posted @ 2017-09-06 23:19  月关莫利亚  阅读(169)  评论(0编辑  收藏  举报