Spring依赖注入

开课吧开课吧锤锤2021-08-09 11:54

Spring依赖注入(DependencyInjection,DI)和控制反转含义相同,它们是从两个角度描述的同一个概念。使用依赖注入可以更轻松的管理和测试应用程序。  

Spring依赖注入

当某个Java实例需要另一个Java实例时,传统的方法是由调用者创建被调用者的实例(例如,使用new关键字获得被调用者实例),而使用Spring框架后,被调用者的实例不再由调用者创建,而是由Spring容器创建,这称为控制反转。  

Spring容器在创建被调用者的实例时,会自动将调用者需要的对象实例注入给调用者,调用者通过Spring容器获得被调用者实例,这称为依赖注入。  

依赖注入主要有两种实现方式,分别是setter注入(又称设值注入)和构造函数注入。具体介绍如下。  

1)构造函数注入  

指IoC容器使用构造函数注入被依赖的实例。可以通过调用带参数的构造函数实现依赖注入,每个参数代表一个依赖。  

2)setter注入  

指IoC容器使用setter方法注入被依赖的实例。通过调用无参构造器或无参static工厂方法实例化Bean后,调用该Bean的setter方法,即可实现基于setter的DI。  

在Spring实例化Bean的过程中,首先会调用默认的构造方法实例化Bean对象,然后通过Java的反射机制调用setXxx()方法进行属性的注入。因此,setter注入要求Bean的对应类必须满足以下两点要求。  

必须提供一个默认的无参构造方法。  

必须为需要注入的属性提供对应的setter方法。  

使用setter注入时,在Spring配置文件中,需要使用<bean>元素的子元素<property>为每个属性注入值。而使用构造注入时,在配置文件中,主要使用<constructor-arg>标签定义构造方法的参数,使用其value属性(或子元素)设置该参数的值。  

构造函数注入  

下面使用<constructor-arg>标签实现构造函数注入。  

在<constructor-arg>标签中,包含ref、value、type、index等属性。value属性用于注入基本数据类型以及字符串类型的值;ref属性用于注入已经定义好的Bean;type属性用来指定对应的构造函数,当构造函数有多个参数时,可以使用index属性指定参数的位置,index属性值从0开始。  

例1  

下面使用EclipseIDE演示通过构造函数注入依赖项,步骤如下:  

1、创建SpringDemo项目,并在src目录下创建net.kaikeba包。  

2、添加相应的jar包。  

3、在net.kaikeba包下创建Person、Man和MainApp类。  

4、在src目录下创建Spring配置文件Beans.xml。  

5、运行SpringDemo项目。  

Person类代码如下。  

package net.kaikeba;
public class Person {
    private Man man;
    public Person(Man man) {
        System.out.println("在Person的构造函数内");
        this.man = man;
    }
    public void man() {
        man.show();
    }
}

Man类代码如下。  

package net.kaikeba;
public class Man {
    private String name;
    private int age;
    public Man() {
        System.out.println("在man的构造函数内");
    }
    public Man(String name, int age) {
        System.out.println("在man的有参构造函数内");
        this.name = name;
        this.age = age;
    }
    public void show() {
        System.out.println("名称:" + name + "\n年龄:" + age);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

Beans.xml配置文件如下。  

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="man" class="net.kaikeba.Man">
        <constructor-arg value="kaikeba" />
        <constructor-arg value="8" type="int" />
    </bean>
    <bean id="person" class="net.kaikeba.Person">
        <constructor-arg ref="man" type="java.lang.String"/>
    </bean>
</beans>

MainApp类代码如下。  

package net.kaikeba;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
        Person person = (Person) context.getBean("person");
        person.man();
    }
}

运行结果如下。  

在man的有参构造函数内
在Person的构造函数内
名称:kaikeba
年龄:8

setter注入  

下面使用<property>标签实现setter注入。  

在<property>标签中,包含name、ref、value等属性。name用于指定参数名称;value属性用于注入基本数据类型以及字符串类型的值;ref属性用于注入已经定义好的Bean。  

例2  

在例1的基础上修改Man类的内容,代码如下。  

package net.kaikeba;
public class Man {
    private String name;
    private int age;
    public Man() {
        System.out.println("在man的构造函数内");
    }
    public Man(String name, int age) {
        System.out.println("在man的有参构造函数内");
        this.name = name;
        this.age = age;
    }
    public void show() {
        System.out.println("名称:" + name + "\n年龄:" + age);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

Beans.xml配置文件如下。  

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="person" class="net.kaikeba.Person">
        <property name="man" ref="man" />
    </bean>
    <bean id="man" class="net.kaikeba.Man">
        <property name="name" value="kaikeba" />
        <property name="age" value="8" />
    </bean>
</beans>

运行结果如下。 

在man的构造函数内
在setMan方法内
名称:kaikeba
年龄:8

以上就是开课吧广场小编为大家整理发布的“Spring依赖注入”一文,更多Java教程相关内容尽在开课吧广场Java教程频道!  

Spring依赖注入

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享