DI依赖注入

news2024/10/5 7:31:39

DI依赖注入

  • Setter注入
    • setter注入引用类型
    • setter注入简单类型(基本数据类型和字符串)
  • 构造器注入
    • 构造器注入引用类型
  • 自动装配
  • 集合注入

首先我们明确一些观点
1、注入的Bean的数据包括引用类型与简单类型(基本数据类型和字符串)
2、通过setter方法与构造方法向一个类注入数据
3、依赖注入方式setter注入引用类型与简单类型;构造器注入引用类型与简单类型


Setter注入

setter注入引用类型

1、在bean中定义引用类型属性,并提供可访问的set方法
set方法
2、 配置中使用property标签ref属性注入引用类型对象
注入引用类型

setter注入简单类型(基本数据类型和字符串)

其实把ref地址改成value值就好了。
1、我们首先在dao层类中加入数据如下(在BookDaoImpl类中声明对应的简单数据类型的属性,并提供对应的setter方法)
基本类型
2、我们在配置文件中修改赋值(在applicationContext.xml配置文件中使用property标签注入)
基本类型配置文件

对于setter注入方式的基本使用就已经介绍完了,

  • 对于引用数据类型使用的是 < property name=“” ref=“”/>
  • 对于简单数据类型使用的是 < property name=“” value=“”/>

构造器注入

构造器注入引用类型

1、删除setter方法并提供构造方法(在BookServiceImpl类中将bookDao的setter方法删除掉,并添加带有bookDao参数的构造方法)
构造器应用

2、配置文件中进行配置构造方式注入

<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <constructor-arg name="userDao" ref="userDao"/>
        <constructor-arg name="bookDao" ref="bookDao"/>
    </bean>

我们稍微总结一下
在这里插入图片描述

其实也只是换一个属性罢了。
name属性对应的值为构造函数中方法形参的参数名,必须要保持一致。
ref属性指向的是spring的IOC容器中其他bean对象。

构造器注入简单类型也类似咯。我们不在赘述。

  1. 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现强制依赖指对象在创建的过程中必须要注入指定的参数
  2. 可选依赖使用setter注入进行,灵活性强可选依赖指对象在创建过程中注入的参数可有可无
  3. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
  4. 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
  5. 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注
  6. 自己开发的模块推荐使用setter注入

自动装配

先来熟悉一下自动装配的定义:IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配。

自动装配的方式:按类型(常用);按名称 ; 按构造方法 ; 不启用自动装配

按类型(常用):

<bean class="com.itheima.dao.impl.BookDaoImpl"/> 
<!--autowire属性:开启自动装配,通常使用按类型装配--> 
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>

按名称:

<bean class="com.itheima.dao.impl.BookDaoImpl"/> 
<!--autowire属性:开启自动装配,通常使用按类型装配--> 
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byName"/>

在这里我们值得注意的是关于名字我们依据的是什么名字?

  • bookDao是private修饰的,外部类无法直接方法外部类只能通过属性的set方法进行访问,对外部类来说,setBookDao方法名,去掉set后首字母小写是其属性名那么为什么是去掉set首字母小写?这个规则是set方法生成的默认规则,set方法的生成是把属性名首字母大写前面加set形成的方法名所以按照名称注入,其实是和对应的set方法有关,但是如果按照标准起名称,属性名和set对应的名是一致的。
  • 如果按照名称去找对应的bean对象,找不到则注入Null
  • 当某一个类型在IOC容器中有多个对象,按照名称注入只找其指定名称对应的bean对象,不会报错

最后对于依赖注入,需要注意一些其他的配置特征:

  1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
  3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
  4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

集合注入

前面我们看了应用类型和基本类型的注入,那如果是Map呢、set呢,这些集合怎么办捏?

1、在类中编写属性并基于其构造方法(所以是setter注入啦)
集合注入

2、编写xml文件(按规定的格式)

<!--代码来自黑马哦,推荐跟着B站视频学,我是跟视频的,老师讲的很不错哟-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--数组注入-->
        <property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </array>
        </property>
        <!--list集合注入-->
        <property name="list">
            <list>
                <value>itcast</value>
                <value>itheima</value>
                <value>boxuegu</value>
                <value>chuanzhihui</value>
            </list>
        </property>
        <!--set集合注入-->
        <property name="set">
            <set>
                <value>itcast</value>
                <value>itheima</value>
                <value>boxuegu</value>
                <value>boxuegu</value>
            </set>
        </property>
        <!--map集合注入-->
        <property name="map">
            <map>
                <entry key="country" value="china"/>
                <entry key="province" value="henan"/>
                <entry key="city" value="kaifeng"/>
            </map>
        </property>
        <!--Properties注入-->
        <property name="properties">
            <props>
                <prop key="country">china</prop>
                <prop key="province">henan</prop>
                <prop key="city">kaifeng</prop>
            </props>
        </property>
    </bean>
  • property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写、、、、标签
  • List的底层也是通过数组实现的,所以和标签是可以混用
  • 集合中要添加引用类型,只需要把标签改成标签,这种方式用的比较少

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

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

相关文章

HTML5 地理定位

HTML5 Geolocation&#xff08;地理定位&#xff09; HTML5 Geolocation&#xff08;地理定位&#xff09;用于定位用户的位置。 Geolocation 通过请求一个位置信息&#xff0c;用户同意后&#xff0c;浏览器会返回一个包含经度和维度的位置信息&#xff01; 定位用户的位置 …

【C语言数组部分】

数组部分综述引入&#xff1a;数组概念&#xff1a;一、一维数组1.1一维数组的创建&#xff1a;1.2一维数组的初始化&#xff1a;1.2.1初始化概念&#xff1a;1.2.2完全初始化&#xff1a;1.2.3不完全初始化&#xff1a;1.3字符数组的初始化&#xff1a;1.3.1用字符初始化&…

如何解决spring的循环依赖问题?

前言 昨天我们说了什么是spring的循环依赖&#xff0c;以及产生的原因&#xff0c;今天那我们就来说说如何解决spring的循环依赖问题。 上篇文章说到过&#xff0c;只有通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题是被解决的&#xff1f; Spring是怎样解决…

rhce第二次作业

配置ssh免密登陆&#xff0c;能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 [root456 ~]# hostname host [root456 ~]# bash \\更改名称[roothost ~]# su redhat …

2023年腾讯云S5云服务器性能网络收发包PPS、连接数、内网带宽能力等性能测评

腾讯云服务器标准型S5实例CPU采用Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;主频2.5GHz&#xff0c;睿频3.1GHz&#xff0c;标准型S5云服务器基于全新优化虚拟化平台&#xff0c;配有全新的Intel Advanced Vector Extension (AVX-512) 指令集&#…

微服务+springcloud+springcloud alibaba学习笔记【Spring Cloud服务网关】(7/9)

Spring Cloud服务网关 7/91、GateWay概述2、GateWay的特性:3、GateWay与zuul的区别:4、zuul1.x的模型:5、什么是webflux:6、GateWay三大概念:6.1,路由:6.2,断言:6.3,过滤:7、GateWay的工作原理:8、使用GateWay:8.1,建module8.2,修改pom文件8.3,写配置文件8.4,主启动类8.5,针对p…

Springboot 整合 Redis 进行基本操作

SpringBoot整合Redis 首先创建 Springboot 项目。 spring-data-redis针对jedis提供了如下功能&#xff1a;1.连接池自动管理&#xff0c;并提供了一个高度封装的“RedisTemplate”类2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口ValueOperat…

计网第六章.应用层各协议概览

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 目录一. C/S方式和P2P对等方式二. 动态主机配置协议DHCP三.域名系统DNS域名解析过程四.文件传输协议FTP基本工作原理&#xff1a;五.电子邮件六.万维网www万维网的文档6.1 HTTP&#xff08;HyperText Transfer Protocol&am…

左手Python 右手R —— 最大公约数和最小公倍数

左手Python 右手R —— 最大公约数和最小公倍数前言1、 最大公约数1.1 约数1.2 最大公约数1.3 求解方法2、 最小公倍数2.1 倍数2.2 最小公倍数2.3 求解方法3、程序实现3.1 python 代码实现3.2 R语言代码实现小结创作不易&#xff0c;都浏览到这儿了&#xff0c;看官可否将下面的…

【Linux系统创建,修改用户和组和修改目录文件的权限以及实验的心得体会】

实验过程 1.创建一个新用户nick,设置其主目录为home/nick。 &#xff08;1&#xff09;添加新用户&#xff1a; sudo useradd -m 用户名 sudo passwd 新用户名 &#xff08;2&#xff09;给新用户可以执行的root权限 sudo vi /etc/sudoers #User privilege specification roo…

Spring Security实战(一)——基于内存和数据库模型的认证与授权

目录 简介 一、初识Spring Security&#xff08;入门案例&#xff09; &#xff08;1&#xff09;新建project &#xff08;2&#xff09;选择依赖 &#xff08;3&#xff09;编写一个 HelloController &#xff08;4&#xff09;启动项目&#xff0c;访问localhost:8080…

手动清除gitlab中prometheus的数据

背景&#xff1a; gitlab服务器上&#xff0c; 磁盘经常爆满。后来通过 du -sh ./* 查出prometheus下的data占了绝大多数磁盘空间。 因此&#xff0c;准备删除prometheus的数据。 思路 由于prometheus的数据占用的空间较大&#xff0c;因此在实际使用时&#xff0c;可以关闭…

【 Spring MVC 核心功能(一) - 使用注解实现 URL 路由映射】

文章目录引言一、RequestMapping 注解介绍1.1 RequestMapping 是 post 还是 get 请求&#xff1f;1.2 RequestMapping 指定一种请求方式二、GetMapping三、PostMapping四、总结引言 前面我们讲到&#xff0c;学习 Spring MVC 需要掌握三个核心功能即连接&#xff0c;获取参数&…

avi文件怎么转成mp4视频,3种方法快速学

avi文件怎么转成mp4视频&#xff1f;前面小编给大家讲了mov格式和webm格式&#xff0c;以及如何将mov和webm格式转换成mp4格式。今天小编给大家说一说另外一种视频格式&#xff0c;就是avi&#xff0c;AVI英文全称为Audio Video Interleaved&#xff0c;即音频视频交错格式&…

SpringBoot中对Bean的处理方法以及第三方Bean处理的方式

我们可以通过Spring当中提供的注解Component以及它的三个衍生注解&#xff08;Controller、Service、Repository&#xff09;来声明IOC容器中的bean对象&#xff0c;为应用程序注入运行时所需要依赖的bean对象&#xff0c;也就是依赖注入DI。 关于IOC容器中Bean的其他使用细节…

矿泉水为什么会溴酸盐超标

矿泉水为什么会溴酸盐超标&#xff1f; 水生产企业多使用臭氧消毒&#xff0c;不过&#xff0c;水生产企业不存在水运输路途遥远的问题&#xff0c;因此可以使用臭氧消毒。同时&#xff0c;也是因为臭氧在消毒后会直接变成氧气&#xff0c;所以不会有使用氯消毒后的那种味道&a…

give_you_flag(GIF原理、二维码定位符)

下载附件是一个GIF 看到最后你会发现它突然漏了一个二维码出来 我们将这个GIF分解成图片&#xff08;动图就是由多张静态图片组合而成&#xff0c;按照一定的顺序和时间播放的&#xff09; https://tu.sioe.cn/gj/fenjie/ 提取出里面包含二维码的那张 但是我们发现这里有一个…

word2vec原理

1.背景 2013年&#xff0c;Google开源了一款用于词向量计算的工具—word2vec&#xff0c;引起了工业界和学术界的关注。首先&#xff0c;word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练&#xff1b;其次&#xff0c;该工具得到的训练结果——词向量(word embed…

GDPU C语言 天码行空7

1. 数组最大值交换 ⭐ 1e9&#xff1a;10的9次方 #include<stdio.h>int main() {int n, i,idx 0;//idx 记录第一个出现的最大值下标scanf("%d", &n);double a[30];double max -1e9;// 1e9 表示10的9次方&#xff0c;十亿&#xff0c;int 的最大范围级别…

使用RT-Thread Studio搭配STM32CubeMX新建RT-Thread项目

STM32CubeMX下载 RT-Thread Studio下载 安装好RT-Thread Studio后&#xff0c;先打开RT-Thread SDK管理器确认有没有自己MCU需要的SDK包&#xff0c;直接安装好之后里面是有STM32F1系列的SDK包&#xff0c;其他的需要自己安装。 之后点击文件→新建→RT-Thread项目&#xff0…