【spring系列】spring依赖注入实现方式(含案例)

依赖注入是时下最流行的IoC实现方式,
依赖注入分为
接口注入(Interface Injection),
Setter方法注入(Setter Injection)
构造器注入(Constructor Injection)

其中接口注入由于在灵活性和易用性比较差,现在从Spring4开始已被废弃。

构造器依赖注入

构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。

使用案例

1、导入依赖

<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-webmvcartifactId>
  <version>5.3.17version>
dependency>
<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-contextartifactId>
  <version>5.3.17version>
  <scope>compilescope>
        dependency>

2、创建实体类

package com.walker.spring.entity;

public class ConstructorEntity {
    private String name;
    private String age;

    //1、创建构造方法
    public ConstructorEntity(String name, String age) {
        this.name = name;
        this.age = age;
    }

    //以及getter方法也需要,用于待会测试使用
    public String getName() {
        return name;
    }

    public String getAge() {
        return age;
    }
}

3、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">

<!-- constructor-arg:构造参数
   index:索引,代表第几个参数
   value:值-->
    <bean id="constructorEntity" class="com.walker.spring.entity.ConstructorEntity">
        <constructor-arg index="0" value="walker aaaa"/>
        <constructor-arg index="1" value="20"/>
    </bean>


</beans>

4、编写测试方法并执行

    /**
     * 测试构造方法
     */
    public void testConstructor(){
        //1、创建xml读取上下文context
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //2、使用context获取对应的容器
        ConstructorEntity constructorEntity = (ConstructorEntity) context.getBean("constructorEntity");
        //3、输出
        System.out.println(constructorEntity.getName());
        System.out.println(constructorEntity.getAge());
    }

之后再main方法中执行
返回结果:

walker aaaa
20

Setter方法注入

Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。

使用案例

1、导入依赖

<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-webmvcartifactId>
  <version>5.3.17version>
dependency>
<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-contextartifactId>
  <version>5.3.17version>
  <scope>compilescope>
        dependency>

2、创建实体类

package com.walker.spring.entity;

import lombok.Data;


public class TestEntity {

    private String name;
    private String age;

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

3、创建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">

<!--id:容器的id 可以自定义
    class: 实体类的全路径
    property:属性-->
    <bean id="testEntity" class="com.walker.spring.entity.TestEntity">
        <property name="name" value="Hello World!" />
        <property name="age" value="18"/>
    </bean>


</beans>

4、测试

package com.walker.spring;

import com.walker.spring.entity.TestEntity;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

    public static void main(String[] args) {
        //1、创建xml读取上下文context
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //2、使用context获取对应的容器
        TestEntity testEntity = (TestEntity) context.getBean("testEntity");
        //3、输出
        System.out.println(testEntity.getName());
        System.out.println(testEntity.getAge());
    }
}

5、返回结果

Hello World!
18

返回的结果是beans.xml中设置的

构造器依赖注入和 Setter方法注入的区别

构造函数注入 setter注入
没有部分注入 有部分注入
不会覆盖 setter 属性 会覆盖 setter 属性
任意修改都会创建一个新实例 任意修改不会创建一个新实例
适用于设置很多属性 适用于设置少量属性

两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。

你可能感兴趣的:(spring系列,spring)