目录

1、构造函数注入

2、setter 方法注入


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

控制反转。

依赖注入。

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

构造函数注入

通过调用带参数的构造函数实现依赖注入,每个参数代表一个依赖。// 就是在创建的时候带上参数值

setter 方法注入

// 等同于属性赋值

// 必须先实例化(构造函数),然后才能初始化( init 等)

  • 必须提供一个默认的无参构造方法。
  • 必须为需要注入的属性提供对应的 setter 方法。

       使用 setter 注入时,在 Spring 配置文件中,需要使用 <bean> 元素的子元素 <property> 为每个属性注入值。

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

1、构造函数注入

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

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

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

  1. 创建 Spring 项目,并在 src 目录下创建 com.spring_learn 包。
  2. 在 com.spring_learn 包下创建 Person、Man 和 MainApp 类。
  3. 在 src 目录下创建 Spring 配置文件 Beans.xml(附:java配置方式PersonConfiguration)。
  4. 运行 Spring 项目。

Man.class 的代码如下:

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);
    }

    // 省略getter、setter方法...
}

Person.class 的代码如下:

public class Person {
    private Man man;
    public Person(Man man) {
        System.out.println("Person的有参构造函数");
        this.man = man;
    }
    public void man() {
        man.show();
    }
}

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="com.swadian.spring_learn.Man">
        <constructor-arg value="swadian2008" />
        <constructor-arg value="20" type="int" />
    </bean>

    <bean id="person" class="com.swadian.spring_learn.Person">
        <constructor-arg ref="man" type="com.swadian.spring_learn.Man"/>
    </bean>
</beans>

MainApp.class 的代码如下:

public class MainApp {
    public static void main(String[] args) {
        //注解方式
        //AbstractApplicationContext context = new AnnotationConfigApplicationContext(PersonConfiguration.class);
        //xml方式
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
        Person obj = (Person) context.getBean("person");
        obj.man();
    }
}

运行结果如下:

spring 注入依赖的作用 spring依赖注入实例_Spring

使用 Java 代码的 bean 配置方式:

@Configuration
public class PersonConfiguration {
    @Bean("man") //@Bean的原理
    public Man getMan(){
        Man man = new Man("Swadian2008",18);
        //System.out.println("getMan:"+man.hashCode()); 同一个对象
        return man;
    }

    @Bean("person")
    public Person getPerson(){
        Person person = new Person(getMan());//构造函数注入
        return person;
    }
}

2、setter 方法注入

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

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

在上例的基础上修改 Person.class 的内容,代码如下:

public class Person {
    private Man man;
    //添加无参构造
    public Person() {
        System.out.println("Person的无参构造函数");
    }
    public Person(Man man) {
        System.out.println("Person的有参构造函数");
        this.man = man;
    }
    //添加setter方法
    public void setMan(Man man) {
        System.out.println("使用setMan方法");
        this.man = man;
    }
    public void man() {
        man.show();
    }
}

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="com.swadian.spring_learn.Man">
        <constructor-arg value="swadian2008" />
        <constructor-arg value="20" type="int" />
    </bean>

    <bean id="person" class="com.swadian.spring_learn.Person">
        <property name="man" ref="man" />
    </bean>
</beans>

运行结果如下:

spring 注入依赖的作用 spring依赖注入实例_Spring_02

使用 Java 代码的 bean 配置方式:

@Configuration
public class PersonConfiguration {
    @Bean("man") //@Bean的原理
    public Man getMan(){
        Man man = new Man("Swadian2008",18);
        //System.out.println("getMan:"+man.hashCode()); 同一个对象
        return man;
    }

    @Bean("person")
    public Person getPerson(){
        Person person = new Person();
        person.setMan(getMan());//setter注入
        return person;
    }
}

至此,Spring 依赖注入的简单示例介绍完毕。