【Spring】(3.3)依赖注入(基于构造器)

【Spring】(3.3)依赖注入(基于构造器)

一、DI(依赖注入)

依赖注入(Dependency Injection)

要理解DI,我们需要理解 “依赖注入”这几个字的意思,我们先简单拆分一下吧。

依赖:

  • 谁的依赖?对象的依赖,就如同下文的User类,每一个用户对象,都依赖一个name属性,因为这个属性组成了这个对象的具体信息。
  • 依赖谁?依赖Spring容器ApplicationContext,因为bean对象的全部创建都依赖于容器。

注入:

  • 注入什么?注入值,注入到对象属性值中。
  • 谁来注入的?由Spring容器来注入的。

以上是我个人简单理解,当然你也可以 简单理解成给对象的属性赋值

下面案例将演示使用 xml配置文件 进行基于构造器的四种依赖注入。

二、基于构造器的四种依赖注入

项目结构:
在这里插入图片描述

创建一个User类,有一个有参构造器。

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

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

编写配置文件。

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 第一种(推荐):基于参数名解析,使用name属性注入 -->
    <bean id="user1" class="com.shengjava.pojo.User">
        <constructor-arg name="name" value="长生"/>
    </bean>
    <!-- 第二种:基于参数下标解析,使用index属性注入,第一个参数下标为0 -->
    <bean id="user2" class="com.shengjava.pojo.User">
        <constructor-arg index="0" value="长生"/>
    </bean>
    <!-- 第三种(不推荐):基于参数类型匹配,使用参数类型注入 -->
    <bean id="user3" class="com.shengjava.pojo.User">
        <constructor-arg type="java.lang.String" value="长生"/>
    </bean>
    <!-- 第四种:基于ref引用,使用ref属性注入 -->
    <bean id="user4" class="com.shengjava.pojo.User">
        <constructor-arg  ref="str"/>
    </bean>
    <bean id="str" class="java.lang.String">
        <constructor-arg type="java.lang.String" value="长生"/>
    </bean>

</beans>

测试类

public class UserTest {
    @Test
    public static void main(String[] args) {
        // create and configure beans(现在我们的对象都是Spring进行管理了,我们可以去Spring的容器ApplicationContext中获取。context:上下文、环境的意思)
        ApplicationContext context = new ClassPathXmlApplicationContext("pojos.xml");

        // retrieve configured instance(从上下文context中获取对象)
        User user1 = context.getBean("user1", User.class);
        User user2 = context.getBean("user2", User.class);
        User user3 = context.getBean("user3", User.class);
        User user4 = context.getBean("user4", User.class);
        System.out.println(user1);
        System.out.println(user2);
        System.out.println(user3);
        System.out.println(user4);

    }
}

输出

User{name='长生'}
User{name='长生'}
User{name='长生'}
User{name='长生'}

参考官方文档:1.4.1. Dependency Injection