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

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

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

构造器依赖注入

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

使用案例

1、导入依赖
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.3.17</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.3.17</version>
  <scope>compile</scope>
        </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.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.3.17</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.3.17</version>
  <scope>compile</scope>
        </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方法实现可选依赖。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WalkerShen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值