Spring 6【DI的两种方式、自动注入】(四)-全面详解(学习总结---从入门到深化)

news2024/10/5 16:20:46

 

目录

八、DI的两种方式

九、自动注入


八、DI的两种方式

IoC是由IoC容器帮助实例化Bean,并且在IoC容器内部注入关联属性(对象)的过程。 在上面演示的都是如何实例化Bean,下面演示的是如果给Bean注入属性。也就是说在讲解IoC/DI的另 一半功能。

在前面讲解DI时,官方文档明确说明了DI有两种方式。官网说明如下:

翻译过来,就是下图效果:

 

1. 构造注入 

构造注入要求必须在Bean中提供有参构造方法(无参数最好也提供上,这个位置不用。但是其他位置如果没有通过构造注入,默认是调用无参构造。

1.1 检查Bean类中是否有有参构造方法

检查com.bjsxt.pojo.People是否有有参构造方法,并且注意构造方法参数列表类型和参数顺序。

public class People {
      private int id;
      private String name;
      // 无参数构造
   public People() {}
   // 有参构造
   public People(int id, String name) {
     this.id = id;
     this.name = name;
   }
// getter/setter 没有粘贴到文档中
}

1.2 配置bean

在配置文件applicationContext.xml中可以通过的子标签设置构造方法中一个参数的值。

 解释说明:

constructor-arg 里面有5个属性,这5个属性分为2类。

(1)用来确定给哪个属性进行赋值

name:参数名称

index:参数索引。从0开始算起。

type:参数类型。8大基本数据类型可以直接写关键字。其他类型需要写类型的全限定路径。 这三个属性如果只需要用到一个就能精确的告诉Spring,要设置的构造方法参数是哪个可以使用一 个。如果无法精确到某个构造方法参数,可以多个一起结合使用。

(2)设置属性的值

value:简单数据类型直接设置。Spring会自动进行类型转换。

ref:需要引用另一个bean的id。也就是说这个参数是一个类类型,且这个类的对象也被Spring 容器管理。

 下面代码使用了type进行确认到底给构造方法哪个参数赋值。也可以尝试使用其他的属性来确认参数。

<bean id="peo4" class="com.tong.pojo.People">
    <constructor-arg type="int" value="1"></constructor-arg>
    <constructor-arg type="java.lang.String" value="张三"></constructor-arg>
</bean>

1.3 编写测试类并观察控制台运行结果

/*
DI构造注入
*/
@Test
void constructorDI(){
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    People peo4 = context.getBean("peo4", People.class);
    System.out.println(peo4);
}

控制台输出结果包含了配置的值

2.设值注入(setter注入) 

2.1 检查Bean类中是否有Setter方法

Setter注入一般都是结合无参构造方法一起使用。所以类中有无参构造方法。

package com.tong.pojo;
public class People {
     private int id;
     private String name;
     public People() {}
     public People(int id, String name) {
           this.id = id;
           this.name = name;
       }

     public int getId() {
            return id;
      }
     public void setId(int id) {
            this.id = id;
      }
     public String getName() {
            return name;
      }
     public void setName(String name) {
           this.name = name;
      }
    @Override
    public String toString() {
            return "People{" + "id=" + id + ", name='" + name + '\'' + '}';
       }
}

1.2 配置Bean

重新配置了一个bean标签,并设置id=“peo5”。

通过 标签调用类的setter方法。

1、name:属性名称。

2、value:属性值。

3、ref:引用另一个bean标签的id属性。

<bean id="peo5" class="com.tong.pojo.People">
   <property name="id" value="2"></property>
   <property name="name" value="李四"></property>
</bean>

1.3 编写测试类并观察控制台结果

在测试类中获取peo5的bean,并输出到控制台,查看是否包含设置的值。

3.构造注入和设值注入的混合使用

也可以让构造注入和设值注入混合使用。这两种方式只要保证有对应的构造方法和setter方法,就可以 使用其中一种方式设置部分属性的值。

先保证People中有一个参数的构造方法,并且包含name属性的setter方法。

package com.tong.pojo;
public class People {
     private int id;
     private String name;
     public People() {}
    // 只有id属性的构造方法
     public People(int id) {
            this.id = id;
      }
     public People(int id, String name) {
            this.id = id;
            this.name = name;
       }
     // getter/setter 没有粘贴到文档中
     public int getId() {
            return id;
       }
     public void setId(int id) {
            this.id = id;
       }
     public String getName() {
           return name;
      }
     public void setName(String name) {
          this.name = name;
      }
    @Override
    public String toString() {
           return "People{" + "id=" + id + ", name='" + name + '\'' + '}';
   }
}

在配置文件中混合使用两种方式

<bean id="peo6" class="com.tong.pojo.People">
    <constructor-arg index="0" value="3"></constructor-arg>
    <property name="name" value="王五"></property>
</bean>

在测试类中获取peo5的bean,并输出到控制台,查看是否包含设置的值。

4.不同属性类型对应的写法

前面在讲解DI两种实现方式时,属性都是简单数据类型。如果类的属性是数组、集合、对象等类型需要 通过下面方式进行设置。 这些标签都是或的子标签。

一旦使用了下面子标签方式,就不能对 或 设置value属性或ref属 性。且需要在People类中提供对应名称,对应类型的属性。下面示例中没有粘贴People类提供对应类 型,对应名称属性的代码。

4.1 引用其他Bean

如果需要引用其他Bean,直接在property标签中使用ref引用就可以。使用子标签ref也可以,但是没有直接用ref属性的方式简单。

<bean id="tea" class="com.tong.pojo.Teacher"></bean>
    <bean id="peo7" class="com.tong.pojo.People">
    <property name="teacher" ref="tea"></property>
</bean>

4.2 Set类型

<bean id="peo7" class="com.tong.pojo.People">
    <property name="hover">
     <set>
       <value>童小纯</value>
       <value>听smallming</value>
    </set>
   </property>
</bean>

4.3 List类型

<bean id="peo7" class="com.tong.pojo.People">
   <property name="subjects">
    <list>
      <value>java</value>
      <value>前端</value>
   </list>
  </property>
</bean>

4.4 Array类型

<bean id="peo7" class="com.tong.pojo.People">
   <property name="teachers">
     <array>
       <value>小童</value>
       <value>张佳明</value>
     </array>
   </property>
</bean>

4.5 Map类型

<bean id="peo7" class="com.tong.pojo.People">
   <property name="phone">
    <map>
      <entry key="姓名" value="18612345678"></entry>
    </map>
  </property>
</bean>

4.6 Prop值类型

Prop就是Properties类型。Properties是HashTable的子类型。内容满足Key-value。

<bean id="peo7" class="com.tong.pojo.People">
   <property name="properties">
     <props>
        <prop key="a">a1</prop>
        <prop key="b">b1</prop>
     </props>
   </property>
</bean>

4.7 Null值类型

<bean id="peo7" class="com.tong.pojo.People">
    <property name="phone">
      <null></null>
    </property>
</bean>

九、自动注入

在Spring中,允许Bean的自动注入。有两种方式进行配置。

1、在根标签 中配置default-autowire属性。标签整个Spring中自动注入的策略。可取值有5 个。

2、default:默认值。不自动注入。

3、no:不自动注入。

4、byName:通过名称自动注入。会自动寻找容器中与当前属性同名的bean进行注入。

5、byType:通过类型自动注入。会自动寻找容器中与当前bean类型匹配的bean进行注入。如果有多 个相同类型的bean注入会出现异常。

6、constructor:通过构造方法进行注入。寻找bean的构造方法中是否有一个包含其他bean类型的参 数。如果有自动注入进去。类型先byType后byName,如果没找到不注入。注:构造方法类型和其 他Bean的类型相同。

<?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"
default-autowire="byName">
<bean id="peo" class="com.tong.pojo.People" ></bean>
</beans>

在 标签中配置autowire属性。和default-autowire取值相同。唯一注意default表示全局 default-autowire的值。如果autowire和default-autowire同时存在,autowire生效。

<bean id="peo" class="com.tong.pojo.People" autowire="byType"></bean>

小提示: 自动注入指的都是bean之间的自动注入。能够自动注入必须保证Spring 容器中包含能被自动注入的bean

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/767316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实训笔记7.18

实训笔记7.18 7.18一、座右铭二、Hadoop大数据技术 大数据软件一般都要求7*24小时不宕机三、Hadoop的组成3.1 HDFS3.2 MapReduce3.3 YARN3.4 Hadoop Common 四、Hadoop生态圈五、Hadoop的安装问题5.1 Hadoop的本地安装模式-基本不用5.2 Hadoop的伪分布安装模式5.3 Hadoop的完全…

webpack插件compression-webpack-plugin

Vue配置compression-webpack-plugin实现Gzip压缩 1、为什么要压缩&#xff1f; 打包的时候开启gzip可以很大程度减少包的大小&#xff0c;页面大小可以变为原来的30%甚至更小&#xff0c;非常适合于上线部署。更小的体积对于用户体验来说就意味着更快的加载速度以及更好的用户…

SOPC之NiosⅡ系统(五)

NIOS Ⅱ系统实例 目录 2.创建BSP工程 2.1 创建BSP工程 2.2 BSP Editor 2.3 创建C代码文件 3.Nios Ⅱ实例 3.1 Hello NIOS Ⅱ 3.2 System ID与Timestamp 3.3 蜂鸣器定时鸣叫 3.4 拨码开关输入GIO控制 4.FPGA器件的代码固化 4.1 嵌入式软件HEX文件生成 4.2 程序存储…

RocketMQ环境搭建

环境搭建 环境准备 下载地址: https://downloads.apache.org/rocketmq/4.9.5/安装 上传至服务器 mkdir /usr/soft #上传至此目录/usr/softmkdir /usr/soft 解压 cd /usr/soft unzip rocketmq-all-4.9.5-bin-release.zip移动 mkdir /usr/local/rocketmq cd /usr/soft mv r…

Mysql 修改group_concat_max_len的默认值

1.前言 最近在进行递归查询组织及其下属组织时&#xff0c;发现数据查询不全&#xff0c;子组织数据查询不出来的问题。经排查发现是group_concat_max_len的长度不足引起的&#xff0c;默认情况下group_concat_max_len1024&#xff0c;所以我们需要修改这个默认参数。 2.SQL语…

.net core控制台应用程序在linux运行

1&#xff09;创建.net 6.0控制台应用程序 2&#xff09;在应用根目录执行cmd命令发布应用&#xff1a;dotnet publish -o .\deploy 3&#xff09;将发布文件上传到服务器 4&#xff09;运行控制台应用程序&#xff08;dotnet /home/app/ConsoleApp/ConsoleApp5.dll&#xff09…

卡尔曼与扩展卡尔曼的区别与推导

1.卡尔曼的推导&#xff1a; 1&#xff09;先看系统随机系统状态空间模型&#xff1a;&#xff08;线性&#xff09; 所谓线性是指递推或者状态转移方程是线性的 至于参数解释自己去看书&#xff0c;本文旨在捋顺推导思路。 2&#xff09;k-1时刻值减去k-1的状态最优估计k-1时…

Vscode设置忽略文件,忽略node-modules、dist

####看图 files.exclude 设置排除和显示的文件夹 search.exclude 设置搜索时忽略的文件夹

WEB:Cat

背景知识 命令执行漏洞 Django框架 题目 先ping一下&#xff0c;输入127.0.0.1 这个输入可能存在命令执行的操作&#xff0c;但是经过尝试之后并不能正常执行 127.0.0.1&&dir、127.0.0.1&&ls、127.0.0.1|ls均被屏蔽&#xff0c;但经过尝试可知&#xff0c;网…

matplotlib笔记:qbstyle设置matplotlib 主题

0 原始matplotlib import numpy as np import matplotlib.pyplot as pltxnp.linspace(0,100) ynp.sin(100*x)plt.plot(x,y); 1 light from qbstyles import mpl_style mpl_style(darkFalse) #开启light主题 plt.plot(x,y); 2 dark from qbstyles import mpl_style mpl_styl…

实现大文件传输的几种方法,并实现不同电脑间大文件传输

随着网络技术的快速发展&#xff0c;大文件的传输需求越来越多&#xff0c;如何在不同的电脑之间实现大文件的快速传输&#xff0c;是一个挑战&#xff0c;下面介绍几种常用的方法可以解决这个问题。 1、利用局域网传输&#xff1a;把两台电脑接入同一个网络环境&#xff0c;通…

关于硬件加速器FPGA的异构加速流程龙蜥CI框架及实践介绍 | 第 87-88 期

本周「龙蜥大讲堂」预告来啦&#xff01;我们邀请了浪潮信息异构加速软件工程师刘科分享《基于 FPGA 的数据库硬件加速研究》、 CICD SIG Maintainer 李晔做《龙蜥社区 CI 框架及实践》主题演讲&#xff0c;精彩多多&#xff0c;快入群&#xff0c;预定前排小板凳观看直播&…

项目名称:无源在线词典项目

一&#xff0c;概述 基于C语言的网络电子词典项目&#xff0c;使用到了tcp协议的并发服务器设计、网络编程、文件I/O、数据库等多方面的知识。可以满足多用户同时登陆&#xff0c;用户登陆后可以查询单词及历史记录&#xff0c;具有查找快速&#xff0c;保密性好等优点。 开…

19.删除链表的倒数第N个节点

19.删除链表的倒数第N个节点 这道题是链表问题中双指针的一个经典应用 如果要删除倒数第n个节点&#xff0c;那么我们让fast快指针移动n步&#xff0c;然后让fast和慢指针slow同时开始移动&#xff0c;当fast指针指向链表末尾的时候&#xff0c;删掉slow指针指向的节点即可。 …

ai绘画工具哪个好用?这几款好用的ai绘画生成器安利给你

嘿&#xff0c;小伙伴们&#xff01;你是否曾经想过创作一幅酷炫的人物插画&#xff0c;但由于缺乏绘画技巧而放弃这个想法&#xff1f;别担心&#xff0c;现在有了ai绘画工具&#xff0c;让你轻松成为艺术家的潜力无限&#xff01;今天我就来给大家介绍几个用ai绘画工具生成好…

【iOS】ARC实现

ARC由以下工具来实现&#xff1a; clang&#xff08;LLVM编译器&#xff09;3.0以上objc4 Objective-C运行时库493.9以上 下面我们&#xff0c;我们将围绕clang汇编输出和objc4库的源代码探究ARC实现 1. __strong修饰符 1.1 赋值给附有__strong修饰符的变量 看下面代码 {…

Android TextView 在最后一行末尾加图标

当前有个需求.显示一段文本&#xff0c;文本最多显示两行&#xff0c;点击展开后才显示完全。当没有显示完全的时候&#xff0c;需要在文本的第二行末尾显示图标&#xff0c;点击图标和文本&#xff0c;文本展开。难点在于图标需要和第二行文本显示在同一行&#xff0c;高度和文…

JavaScript的WebAPI

这里写目录标题 DOM 基本概念获取元素事件概念事件的三要素操作元素获取/修改表单元素属性行内样式操作类名样式操作操作节点 DOM 基本概念 DOM 全称为 Document Object Model. W3C 标准给我们提供了一系列的函数, 让我们可以操作: 网页内容 ,网页结构, 网页样式 DOM数的结构如…

【PDFBox】PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档

这篇文章&#xff0c;主要介绍PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档。 目录 一、PDFBox操作文本 1.1、读取所有页面文本内容 1.2、读取指定页面文本内容 1.3、写入文本内容 1.4、替换文本内容 &#xff08;1&#xf…

【C++】STL之list容器的模拟实现

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处。 文章目录 前言一、list的三个类的关系分析图vector和list的区别1.节点的成员变量以及构造函数2.list的迭代器 二、list的增删查改工作2.1inse…