IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【spring系列】spring依赖注入实现方式(含案例) -> 正文阅读

[Java知识库]【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方法实现可选依赖。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:28:38  更:2022-04-26 11:30:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:55:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码