当前位置: 首页 > news >正文

Spring IoCDI(3)

DI详解

接下来学习一下依赖注入DI的细节.

依赖注入是一个过程, 是指IoC容器在创建Bean时, 去提供运行时所依赖的资源, 而资源指的就是对象. 在之前的案例中, 使用了@Autowired这个注解, 完成了依赖注入这个操作.

简单来说, 就是把对象取出来放到某个类的属性中.

在一些文章中, 依赖注入也称为"对象注入", "属性装配", 具体含义需要结合文章的上下文理解.

关于依赖注入, Spring提供了三种方式:

1.属性注入(Field Injection)

2.构造方法注入(Constructor Injection)

3.Setter注入(Setter Injection).

属性注入

属性注入通过@Autowired实现的, 这里将Service类注入到Controller类中.

@Service
public class MyService {public void sayHi() {System.out.println("Hi, MyService");}
}
@Controller //将对象存储到Spring中
public class MyController2 {//注入方法1: 属性注入@Autowired private MyService myService;public void sayHi() {System.out.println("Hi, UserController...");myService.sayHi();}
}

使用:

@SpringBootApplication
public class SpringbootDemoApplication {public static void main(String[] args) {//获取Spring上下文对象ApplicationContext context = SpringApplication.run(SpringbootDemoApplication.class);MyController2 myController = context.getBean(MyController2.class);myController.sayHi();}
}

最终运行结果如下:

 

构造方法注入

构造方法注入是在类的构造方法中实现注入, 如下所示:

@Controller //将对象存储到Spring中
public class MyController2 {private MyService myService;//注入方法2: 构造方法注入@Autowiredpublic MyController2(MyService myService) {this.myService = myService;}public void sayHi() {System.out.println("Hi, UserController...");myService.sayHi();}
}

注意事项: 如果类中只有一个构造方法, 那么@Autowired注解可以省略(在Spring中, 如果一个类只有一个构造方法, 并且该构造方法不包含任何参数, 那么Spring在实例化这个类的时候会自动将其作为一个Bean注入到容器中); 如果类中有多个构造方法, 那么需要添加上@Autowired来明确指明到底使用哪个构造方法

Setter注入

Setter注入和属性的Setter方法实现类似, 只不过在设置set方法的时候需要加上@Autowired注解:

@Controller //将对象存储到Spring中
public class MyController2 {private MyService myService;//注入方法3: Setter方法注入@Autowiredpublic void setMyService(MyService myService) {this.myService = myService;}public void sayHi() {System.out.println("Hi, UserController...");myService.sayHi();}
}

 这里注意, 对于Setter方法, 是一定要写@Autowired的.

@Autowired存在问题

当同一类型存在多个bean时, 使用@Autowired会存在问题.

@Component
public class BeanConfig {@Bean("u1")public User user1() {User user = new User();user.setName("lisi");user.setAge(20);return user;}@Beanpublic User user2() {User user = new User();user.setName("zhangsan");user.setAge(18);return user;}
}
@Controller
public class MyController4 {@Autowiredprivate User user;public void sayHi() {System.out.println("hi, UserController4...");System.out.println(user);}
}

运行结果:

报错的原因是, 非唯一的Bean对象.

如何解决上述问题呢? Spring提供了以下几种解决方案:

@Primary

@Qualifier

@Resource 

使用@Primary注解: 当存在多个相同类型的Bean注入时, 加上@Primary注解, 来确定默认的实现.

@Component
public class BeanConfig {@Primary // 指定该bean为默认的bean实现.@Bean("u1")public User user1() {User user = new User();user.setName("lisi");user.setAge(20);return user;}@Beanpublic User user2() {User user = new User();user.setName("zhangsan");user.setAge(18);return user;}
}

使用@Qualifier注解: 指定要注入的bean对象. 在@Qualifier的value属性中,指定注入bean的名称.

@Qualifier注解不能单独使用, 必须配合@Autowired使用.

@Controller
public class MyController4 {@Qualifier("user2") //指定bean的名称.@Autowiredprivate User user;public void sayHi() {System.out.println("hi, UserController4...");System.out.println(user);}
}

使用@Resource注解: 是按照bean的方式注入. 通过name属性指定要注入的bean名称. 

@Controller
public class MyController4 {@Resource(name = "user2")private User user;public void sayHi() {System.out.println("hi, UserController4...");System.out.println(user);}
}

常见面试题:

@Autowired和@Resource的区别

@Autowired是Spring框架提供的注解, 而@Resource是JDK提供的注解.(@Primary, @Qualifier是Spring提供的注解).

@Autowired默认是按照类型注入, 而@Resource是按名称注入. 相比于@Autowired来说, @Resource支持更多的参数配置, 例如name设置, 通过name获取bean. 

相关文章:

Spring IoCDI(3)

DI详解 接下来学习一下依赖注入DI的细节. 依赖注入是一个过程, 是指IoC容器在创建Bean时, 去提供运行时所依赖的资源, 而资源指的就是对象. 在之前的案例中, 使用了Autowired这个注解, 完成了依赖注入这个操作. 简单来说, 就是把对象取出来放到某个类的属性中. 在一些文章中…...

保研线性代数机器学习基础复习1

1.什么是代数(algebra)? 为了形式化一个概念,构建出有关这个概念的符号以及操作符号的公式。 2.什么是线性代数(linear algebra)? 一项关于向量以及操作向量的公式的研究。 3.举一些向量的例子&#x…...

js绑定事件的方法

在JavaScript中&#xff0c;绑定事件的方法主要有以下几种&#xff1a; HTML属性方式&#xff1a;直接在HTML元素中使用事件属性来绑定事件。 html<button onclick"alert(Hello World!)">Click Me</button> DOM属性方式&#xff1a;通过JavaScript代码…...

是德科技keysight N9000B 信号分析仪

181/2461/8938产品概述&#xff1a; 工程的内涵就是将各种创意有机地联系起来&#xff0c;并解决遇到的问题。 CXA 信号分析仪具有出色的实际性能&#xff0c;它是一款出类拔萃、经济高效的基本信号表征工具。 它的功能十分强大&#xff0c;为一般用途和教育行业的用户执行测试…...

软考 - 系统架构设计师 - 架构风格

软件架构风格是指描述特定软件系统组织方式的惯用模式。组织方式描述了系统的组成构件&#xff0c;以及这些构件的组织方式&#xff0c;惯用模式指众多系统所共有的结构和语义。 目录 架构风格 数据流风格 批处理架构风格 管道 - 过滤器架构风格 调用 / 返回风格 主程序…...

CleanMyMac X2024专业免费的国产Mac笔记本清理软件

非常高兴有机会向大家介绍CleanMyMac X 2024这款专业的Mac清理软件。它以其强大的清理能力、系统优化效果、出色的用户体验以及高度的安全性&#xff0c;在Mac清理软件市场中独树一帜。 CleanMyMac X2024全新版下载如下: https://wm.makeding.com/iclk/?zoneid49983 一、主要…...

ES6 模块化操作

ES6模块化主要有两个操作&#xff1a;import 和 export 如果在html文件的script中引用模块的话&#xff0c;要设置<script type"module"> 一种导入导出方法&#xff1a; a.js//分别暴露 export let num 1 export function compute(a, b){return a b }//统…...

统计XML文件内标签的种类和其数量及将xml格式转换为yolov5所需的txt格式

1、统计XML文件内标签的种类和其数量 对于自己标注的数据集&#xff0c;需在标注完成后需要对标注好的XML文件校验&#xff0c;下面是代码&#xff0c;只需将SrcDir换成需要统计的xml的文件夹即可。 import os from tqdm import tqdm import xml.dom.minidomdef ReadXml(File…...

《操作系统导论》第14章读书笔记:插叙:内存操作API

《操作系统导论》第14章读书笔记&#xff1a;插叙&#xff1a;内存操作API —— 杭州 2024-03-30 夜 文章目录 《操作系统导论》第14章读书笔记&#xff1a;插叙&#xff1a;内存操作API1.内存类型1.1.栈内存&#xff1a;它的申请和释放操作是编译器来隐式管理的&#xff0c;所…...

HAProxy + Vitess负载均衡

一、环境搭建 Vitess环境搭建&#xff1a; 具体vitess安装不再赘述&#xff0c;主要是需要启动3个vtgate&#xff08;官方推荐vtgate和vtablet数量一致&#xff09; 操作&#xff1a; 在vitess/examples/common/scripts目录中&#xff0c;修改vtgate-up.sh文件&#xff0c;…...

2024年京东云主机租用价格_京东云服务器优惠价格表

2024年京东云服务器优惠价格表&#xff0c;轻量云主机优惠价格5.8元1个月、轻量云主机2C2G3M价格50元一年、196元三年&#xff0c;2C4G5M轻量云主机165元一年&#xff0c;4核8G5M云主机880元一年&#xff0c;游戏联机服务器4C16G配置26元1个月、4C32G价格65元1个月、8核32G费用…...

qt-C++笔记之QSpinBox控件

qt-C笔记之QSpinBox控件 code review! 文章目录 qt-C笔记之QSpinBox控件1.运行2.main.cpp3.main.pro4.《Qt6 C开发指南》&#xff1a;4.4 QSpinBox 和QDoubleSpinBox 1.运行 2.main.cpp #include <QApplication> #include <QSpinBox> #include <QPushButton&g…...

Linux(CentOS)/Windows-C++ 云备份项目(服务器网络通信模块,业务处理模块设计,断点续传设计)

此模块将网络通信模块和业务处理模块进行了合并 网络通信通过httplib库搭建完成业务处理&#xff1a; 文件上传请求&#xff1a;备份客户端上传的文件&#xff0c;响应上传成功客户端列表请求&#xff1a;客户端请求备份文件的请求页面&#xff0c;服务器响应文件下载请求&…...

【QQ版】QQ群短剧机器人源码 全网短剧机器人插件

内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 QQ版本可以兼容两个框架&#xff08;HTQQ&#xff0c;MYQQ这两个的vip版也可以使用) 支持私聊与群聊&#xff0c;命令是 搜剧影视关键词 如果无法搜索到影视资源&#xff0c;请使用下方命令&…...

矩阵间关系的建立

参考文献 2-D Compressive Sensing-Based Visually Secure Multilevel Image Encryption Scheme 加密整体流程如下: 我们关注左上角这一部分: 如何在两个图像之间构建关系,当然是借助第3个矩阵。 A. Establish Relationships Between Different Images 简单说明如下: …...

【C++】C到C++的入门知识

目录 1、C关键字 2、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 2.2.1 加命名空间名称及作用域限定符 2.2.2 使用using将命名空间中某个成员引入 2.2.3 使用using namespace 命名空间名称引入 3、C输入&输出 4、缺省参数 4.1 缺省参数的概念 4.2 缺省参数的…...

【c++】简单的日期计算器

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们本节内容来完成知识的实践&#xff0c;来实现一个简易的日期计算器 目录 头文件声明函数函数的实现1.全缺省默认构…...

基于easyx库的C/C++游戏编程实例-飞机大战

飞机大战游戏设计 首先创建飞机/子弹结构&#xff1a; struct Plane {int x;int y;bool live;int width;int height;int type;int hp; }player,bul[BUL_NUM],enemy[ENE_NUM];你需要加载图片&#xff1a; void ImageLoad() {//背景loadimage(&bg[0], "./image/飞机大…...

stitcher类实现多图自动拼接

效果展示 第一组&#xff1a; 第二组&#xff1a; 第三组&#xff1a; 第四组&#xff1a; 运行代码 import os import sys import cv2 import numpy as npdef Stitch(imgs,savePath): stitcher cv2.Stitcher.create(cv2.Stitcher_PANORAMA)(result, pano) stitcher.st…...

Ubuntu下udp通信

一、知识准备阶段 socket是什么&#xff1f;套接字是什么&#xff1f; https://blog.csdn.net/m0_37925202/article/details/80286946 Socket程序从Windows移植到Linux下的一些注意事项 sockaddr和sockaddr_in详解 bzero和memset函数 函数原型&#xff1a;void bzero&…...

污水处理通气帽标准尺寸参数与国标通气帽定制要点

在好些个工程现场当中&#xff0c;人们往往会忽略掉一个看起来平常但是特别要害的小部件——通气帽。特别是在污水处理的体系当中&#xff0c;它承担平衡内部和外部的气压&#xff0c;阻止异味向外溢出&#xff0c;阻拦异物进入等好几个方面的功能。要是选择类型不适合&#xf…...

基于SpringBoot的核酸检测与报告查询系统毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在构建一个基于Spring Boot框架的核酸检测与报告查询系统以解决当前核酸检测流程中存在的信息孤岛现象数据分散管理问题以及传统人工操作导致的效率低下…...

Flutter从入门到实战-02-Flutter框架核心

Flutter 从入门到实战&#xff08;二&#xff09;&#xff1a;Flutter 框架核心本文根据讲义目标是把“会搭环境、会写页面、会管理状态与路由、会做基础网络请求”串成一条完整上手路径。一、先把开发环境一次搭对 这部分讲义强调的核心思想是&#xff1a;环境问题越早解决&am…...

Adobe-GenP 3.0:Adobe CC通用补丁工具终极完整指南

Adobe-GenP 3.0&#xff1a;Adobe CC通用补丁工具终极完整指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款功能强大的Adobe CC通用补丁工具…...

Illustrator智能脚本终极指南:如何让设计效率提升300%

Illustrator智能脚本终极指南&#xff1a;如何让设计效率提升300% 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 还在为Adobe Illustrator中重复繁琐的操作而烦恼吗&#xff1f;想…...

MCC-425 协议转换网关:打通制冷机组与 CAN 控制器数据链路

背景在工业精密温控领域&#xff0c;制冷机组的运行参数&#xff08;如温度、压力、流量&#xff09;直接决定了工艺流程的稳定性。为了实现生产现场的数字化管理&#xff0c;必须将分布在各工位的制冷机组数据实时汇聚至中控室&#xff0c;以便上位机进行统一监控与逻辑调度 。…...

泛微OA ecology 9实战:手把手教你写一个能取表单数据的Java自定义接口

泛微OA Ecology 9深度开发&#xff1a;构建高效表单数据交互的Java接口实践 在当今企业数字化转型浪潮中&#xff0c;办公自动化系统(OA)作为核心支撑平台&#xff0c;其灵活性和扩展性直接影响着企业运营效率。泛微OA Ecology 9作为国内领先的协同办公平台&#xff0c;提供了丰…...

告别数据焦虑:WeChatExporter如何重塑你的数字记忆管理体验

告别数据焦虑&#xff1a;WeChatExporter如何重塑你的数字记忆管理体验 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 当你深夜翻看三年前的聊天记录&#xff0c;却发现…...

AI系统合规性故障模式解析:从公平性、隐私到可解释性的工程实践

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“AI-Compliance-Failure-Patterns”。光看名字&#xff0c;你大概能猜到它和AI的合规性有关&#xff0c;但具体是做什么的&#xff0c;可能还有点模糊。简单来说&#xff0c;这个项目就像一本针对AI系…...

LLM Wiki Bridge:将Markdown知识库编译为AI可操作的概念图谱

1. 项目概述&#xff1a;将你的知识库变成AI的“第二大脑” 如果你和我一样&#xff0c;是个重度笔记用户&#xff0c;大概率也经历过这样的场景&#xff1a;在Obsidian、Logseq或者任何你喜欢的Markdown编辑器里&#xff0c;日积月累了成百上千篇笔记。你清楚地记得自己写过某…...