Spring依赖注入常见方式(set注入/构造器注入)

在我们写代码的过程中,通常会用new来产生一个对象,但是这样操作的后果会使得代码难于管理。

而Spring框架为我们提供了一个控制反转(IOC,Inversion of Control)的思想。意思是原来由程序员new出来的对象,现在不这样做了,而是把它“反转”。由Spring容器去产生管理这些对象。而依赖注入(DI,Dependency Injection)就是实现控制反转的其中一种方式。
一.set注入:需生产set方法

例1:比如主板类中(Mainboard)含有Cpu对象(Cpu)和Ram(Ram)对象:先生成此两个对象的set方法,分别注入:

public interface Mainboard extends PCComponent{
   private Cpu cpu;
   private Ram ram;
    public void setCpu(Cpu cpu);
    public void setRam(Ram ram);
}

随后编写Spring的配置文件applicationContext.xml。<bean>中的name为类的一个别名,而class为类的完整名称。

<bean id="mainboard" class="com.spring.service.pc.Ipml.InterBoard">
    <property name="cpu">
        <bean class="com.spring.service.pc.Ipml.InterCpu"></bean>
    </property>
    <property name="ram">
        <bean class="com.spring.service.pc.Ipml.KingstoneRam"></bean>
    </property>
</bean>

 例2:创建一个pojo的car类:属性有汽车名字/价格/颜色

public class car implements Serializable {
    private String name;
    private String  color;
    private double price;

    public car() {
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

随后编写Spring的配置文件applicationContext.xml。<bean>中的name为类的一个别名,而class为类的完整名称。分别给汽车名字及汽车颜色与汽车价格进行赋值

 <bean id="car" class="com.spring.service.pojo.car" >
        <!--Set方式注入,-->
       <!-- <property name="name" value="B驰"></property>
        <property name="color" value="红色"></property>
        <property name="price" value="66"></property>-->
    </bean>

二.构造器注入(需生产带参数的构造方法):

构造器注入指的是在类中构造带参数的构造方法实现类的注入,它又可以分为以下几种方式注入:索引注入/数据类型注入

使用方式:
第一,在类中,不用为属性设置setter方法,但是需要生成该类带参的构造方法。
第二,在配置文件中配置该类的bean,并配置构造器,在配置构造器中用到了<constructor-arg>节点,该节点有四个属性:
· index是索引,指定注入的属性,从0开始;
· type是指该属性所对应的类型;
· ref 是指引用的依赖对象;
· value 当注入的不是依赖对象,而是基本数据类型时,就用value;

1.索引注入:

public class car implements Serializable {
    private String name;
    private String  color;
    private double price;
    public car(String name, String color, double price) {
        this.name = name;
        this.color = color;
        this.price = price;
    }
}

在配置文件中,不再用<property>标签,而是用<constructor-arg>标签代替,其中索引序号不能乱:

 <constructor-arg index="0" value="B驰"></constructor-arg>
        <constructor-arg index="1" value="红色"></constructor-arg>
    <constructor-arg index="2" value="66"></constructor-arg>

2.类型注入,其中类型顺序不能乱:

<constructor-arg type="java.lang.String" value="奥迪" ></constructor-arg>
        <constructor-arg type="java.lang.Double" value="500000"></constructor-arg>
        <constructor-arg type="java.lang.String" value="黑色"></constructor-arg>

注意:属性中含有List,Array,Map类型时:了解如下写法:

 <constructor-arg index="3" >
            <list>
                <value>张三</value>
                <value>李四</value>
                <value>王五</value>
            </list>
            <map>
                <entry key="id" value="1"></entry>
            </map>

 

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值