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.
相关文章:
![](https://img-blog.csdnimg.cn/direct/75763b62ea0f4c078986874a0296cf95.png)
Spring IoCDI(3)
DI详解 接下来学习一下依赖注入DI的细节. 依赖注入是一个过程, 是指IoC容器在创建Bean时, 去提供运行时所依赖的资源, 而资源指的就是对象. 在之前的案例中, 使用了Autowired这个注解, 完成了依赖注入这个操作. 简单来说, 就是把对象取出来放到某个类的属性中. 在一些文章中…...
保研线性代数机器学习基础复习1
1.什么是代数(algebra)? 为了形式化一个概念,构建出有关这个概念的符号以及操作符号的公式。 2.什么是线性代数(linear algebra)? 一项关于向量以及操作向量的公式的研究。 3.举一些向量的例子&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
js绑定事件的方法
在JavaScript中,绑定事件的方法主要有以下几种: HTML属性方式:直接在HTML元素中使用事件属性来绑定事件。 html<button onclick"alert(Hello World!)">Click Me</button> DOM属性方式:通过JavaScript代码…...
![](https://img-blog.csdnimg.cn/direct/cb57f25c01af426b89ab6790d647cbb2.jpeg)
是德科技keysight N9000B 信号分析仪
181/2461/8938产品概述: 工程的内涵就是将各种创意有机地联系起来,并解决遇到的问题。 CXA 信号分析仪具有出色的实际性能,它是一款出类拔萃、经济高效的基本信号表征工具。 它的功能十分强大,为一般用途和教育行业的用户执行测试…...
![](https://www.ngui.cc/images/no-images.jpg)
软考 - 系统架构设计师 - 架构风格
软件架构风格是指描述特定软件系统组织方式的惯用模式。组织方式描述了系统的组成构件,以及这些构件的组织方式,惯用模式指众多系统所共有的结构和语义。 目录 架构风格 数据流风格 批处理架构风格 管道 - 过滤器架构风格 调用 / 返回风格 主程序…...
![](https://img-blog.csdnimg.cn/direct/213c0207d9314d0c9508ecd69991a905.png)
CleanMyMac X2024专业免费的国产Mac笔记本清理软件
非常高兴有机会向大家介绍CleanMyMac X 2024这款专业的Mac清理软件。它以其强大的清理能力、系统优化效果、出色的用户体验以及高度的安全性,在Mac清理软件市场中独树一帜。 CleanMyMac X2024全新版下载如下: https://wm.makeding.com/iclk/?zoneid49983 一、主要…...
![](https://www.ngui.cc/images/no-images.jpg)
ES6 模块化操作
ES6模块化主要有两个操作:import 和 export 如果在html文件的script中引用模块的话,要设置<script type"module"> 一种导入导出方法: a.js//分别暴露 export let num 1 export function compute(a, b){return a b }//统…...
![](https://img-blog.csdnimg.cn/direct/2df2d6938af444e49768ef024cb41cb0.jpeg)
统计XML文件内标签的种类和其数量及将xml格式转换为yolov5所需的txt格式
1、统计XML文件内标签的种类和其数量 对于自己标注的数据集,需在标注完成后需要对标注好的XML文件校验,下面是代码,只需将SrcDir换成需要统计的xml的文件夹即可。 import os from tqdm import tqdm import xml.dom.minidomdef ReadXml(File…...
![](https://img-blog.csdnimg.cn/direct/87a6a942b3a5490683e82dd881beb779.png)
《操作系统导论》第14章读书笔记:插叙:内存操作API
《操作系统导论》第14章读书笔记:插叙:内存操作API —— 杭州 2024-03-30 夜 文章目录 《操作系统导论》第14章读书笔记:插叙:内存操作API1.内存类型1.1.栈内存:它的申请和释放操作是编译器来隐式管理的,所…...
![](https://img-blog.csdnimg.cn/img_convert/779cbe5535efbe95381124f6a05634d3.png)
HAProxy + Vitess负载均衡
一、环境搭建 Vitess环境搭建: 具体vitess安装不再赘述,主要是需要启动3个vtgate(官方推荐vtgate和vtablet数量一致) 操作: 在vitess/examples/common/scripts目录中,修改vtgate-up.sh文件,…...
![](https://img-blog.csdnimg.cn/img_convert/751524c31db2fee24e0b9e428621a029.jpeg)
2024年京东云主机租用价格_京东云服务器优惠价格表
2024年京东云服务器优惠价格表,轻量云主机优惠价格5.8元1个月、轻量云主机2C2G3M价格50元一年、196元三年,2C4G5M轻量云主机165元一年,4核8G5M云主机880元一年,游戏联机服务器4C16G配置26元1个月、4C32G价格65元1个月、8核32G费用…...
![](https://img-blog.csdnimg.cn/direct/790d43e95a5a4978ad79eecabf6ae7ec.png)
qt-C++笔记之QSpinBox控件
qt-C笔记之QSpinBox控件 code review! 文章目录 qt-C笔记之QSpinBox控件1.运行2.main.cpp3.main.pro4.《Qt6 C开发指南》:4.4 QSpinBox 和QDoubleSpinBox 1.运行 2.main.cpp #include <QApplication> #include <QSpinBox> #include <QPushButton&g…...
![](https://img-blog.csdnimg.cn/direct/f95bf84bcd544594abe4b07e88002c0e.png)
Linux(CentOS)/Windows-C++ 云备份项目(服务器网络通信模块,业务处理模块设计,断点续传设计)
此模块将网络通信模块和业务处理模块进行了合并 网络通信通过httplib库搭建完成业务处理: 文件上传请求:备份客户端上传的文件,响应上传成功客户端列表请求:客户端请求备份文件的请求页面,服务器响应文件下载请求&…...
![](https://img-blog.csdnimg.cn/direct/66721c8fc1e043cc93a48de41e1ff5c2.jpeg)
【QQ版】QQ群短剧机器人源码 全网短剧机器人插件
内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 QQ版本可以兼容两个框架(HTQQ,MYQQ这两个的vip版也可以使用) 支持私聊与群聊,命令是 搜剧影视关键词 如果无法搜索到影视资源,请使用下方命令&…...
![](https://img-blog.csdnimg.cn/direct/2bb239f0094840a580a6e532b30c1309.png)
矩阵间关系的建立
参考文献 2-D Compressive Sensing-Based Visually Secure Multilevel Image Encryption Scheme 加密整体流程如下: 我们关注左上角这一部分: 如何在两个图像之间构建关系,当然是借助第3个矩阵。 A. Establish Relationships Between Different Images 简单说明如下: …...
![](https://img-blog.csdnimg.cn/direct/c65c16cd593b48b6a3dee71d88338453.png)
【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 缺省参数的…...
![](https://img-blog.csdnimg.cn/direct/a001c865fad5444c9f6a821c059bbe09.png)
【c++】简单的日期计算器
🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好啊,在我们学习了默认成员函数后,我们本节内容来完成知识的实践,来实现一个简易的日期计算器 目录 头文件声明函数函数的实现1.全缺省默认构…...
![](https://www.ngui.cc/images/no-images.jpg)
基于easyx库的C/C++游戏编程实例-飞机大战
飞机大战游戏设计 首先创建飞机/子弹结构: struct Plane {int x;int y;bool live;int width;int height;int type;int hp; }player,bul[BUL_NUM],enemy[ENE_NUM];你需要加载图片: void ImageLoad() {//背景loadimage(&bg[0], "./image/飞机大…...
![](https://img-blog.csdnimg.cn/direct/a2a87e5a7dc541eca84e9aa93f8c6664.png)
stitcher类实现多图自动拼接
效果展示 第一组: 第二组: 第三组: 第四组: 运行代码 import os import sys import cv2 import numpy as npdef Stitch(imgs,savePath): stitcher cv2.Stitcher.create(cv2.Stitcher_PANORAMA)(result, pano) stitcher.st…...
![](https://www.ngui.cc/images/no-images.jpg)
Ubuntu下udp通信
一、知识准备阶段 socket是什么?套接字是什么? https://blog.csdn.net/m0_37925202/article/details/80286946 Socket程序从Windows移植到Linux下的一些注意事项 sockaddr和sockaddr_in详解 bzero和memset函数 函数原型:void bzero&…...
![](https://img-blog.csdnimg.cn/direct/0f0123bb67d74cab9d3d0918f20c0ac3.png)
拌合楼管理软件开发(十三) 对接耀华XK3190-A9地磅(实战篇)
前言: 实战开整 目前而言对于整个拌合楼管理软件开发,因为公司对这个项目还处于讨论中,包括个人对其中的商业逻辑也存在一些质疑,都是在做一些技术上的储备.很早就写好了串口与地磅对接获取代码,也大概知道真个逻辑,这次刚好跟库区沟通,远程连接到磅房电脑,开始实操一下. 一、地…...
![](https://www.ngui.cc/images/no-images.jpg)
FastAPI+React全栈开发10 MongoDB聚合查询
Chapter02 Setting Up the Document Store with MongoDB 10 Aggregation framework FastAPIReact全栈开发10 MongoDB聚合查询 In the following pages, we will try to provide a brief introducton to the MongoDB aggregation framework, what it is, what benefits it of…...
![](https://www.ngui.cc/images/no-images.jpg)
python 报错问题汇总
error: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: d:\\anaconda\\envs\\yolov5\\lib\\site-packages\\ISR-2.2.0-py3.7.egg 解决方法:重启pycharm python-contrib 无法安装 opencv-contrib-python 安装包网址:安装包下载链接…...
![](https://img-blog.csdnimg.cn/img_convert/dd4ec0521ec44b3bb6f6fd4ff7b80c0c.png)
6.5物联网RK3399项目开发实录-驱动开发之LCD显示屏使用(wulianjishu666)
90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接:https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f LCD使用 简介 AIO-3399J开发板外置了两个LCD屏接口,一个是EDP,一个是LVDS,接口对应板…...
![](https://img-blog.csdnimg.cn/13f2cb2e05a14868a3f0fd6ac81d625c.png)
「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K
C、 com.android.provider.contact D、 com.android.provider.contacts 11.下面关于ContentProvider描述错误的是()。 A、 ContentProvider可以暴露数据 B、 ContentProvider用于实现跨程序共享数据 C、 ContentProvider不是四大组件 D、 ContentP…...
![](https://www.ngui.cc/images/no-images.jpg)
【算法】基数排序
简介 基数排序(*Radix sort)是一种非比较排序算法(non-comparative sorting algorithm)。现代计算机的基数排序算法由 计数排序 算法的开发人哈罗德H西华德(Harold H. Seward)于1954年于麻省理工大学开发。…...
![](https://img-blog.csdnimg.cn/img_convert/a9506966467ec8e11c7b4e9f4b00b9e2.jpeg)
2核2G服务器优惠价格轻量61元一年,CVM价格313元15个月
腾讯云2核2G服务器多少钱一年?轻量服务器61元一年,CVM 2核2G S5服务器313.2元15个月,轻量2核2G3M带宽、40系统盘,云服务器CVM S5实例是2核2G、50G系统盘。腾讯云2核2G服务器优惠活动 txybk.com/go/txy 链接打开如下图:…...
![](https://img-blog.csdnimg.cn/direct/c651275a69994b4ea7296c363e6bd12c.png)
不同Python版本和wxPython版本用pyinstaller打包文件大小对比
1、确定wxPython和Python版本的对应关系 在这里可以找到Python支持的所有wxPython版本:https://pypi.tuna.tsinghua.edu.cn/simple/wxpython/ 由于Python从3.6版本开始支持f字符串、从3.9版本开始不支持Windows7操作系统,所以我仅筛选3.6-3.8之间的版本…...
![](https://img-blog.csdnimg.cn/direct/c24ddaeeb7c849318a8245a1dc10e625.png)
【C语言】结构体详解(一)
目录 1、什么是结构体? 2、结构体成分 3、结构体变量的定义与初始化 3.1、结构体变量的三种定义方式 3.2、结构体变量的初始化 4、结构体成员的访问(两种方式) 4.1、直接访问 4.2、间接访问 5、结构的特殊声明 5.1、不完全声明(匿…...
![](https://img-blog.csdnimg.cn/direct/850b60742b67461a85fcfd4491c30868.png)
AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion)
AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion) 前言1、基础对比Stable Diffusion(SD)SD界面安装与使用SD Midjouney(MJ) 2、硬件与运行要求对比Stable Diffusion硬件要求内存硬盘显卡 Midjo…...
![](/attachment/201104/1/20639775_1301638732qZf3.jpg)
wordpress后台修改文章浏览数/最新消息新闻头条
KeepalivedLVSMysql-Cluster(7.1.10)的安装配置NDB Cluster的硬件需求: 管理节点:对硬件没什么要求,差 一点的机器完全能够胜任 数据节点:可以选择大内存,cpu也相对来讲不错 的,尤其是以后ndbmtd对多核Cpu的支持 Mysql节 点&#…...
![](/images/no-images.jpg)
灌阳县建设局门户网站/seo怎么做整站排名
文件描述符 文件描述符编辑内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。…...
![](http://hi.csdn.net/attachment/201112/1/0_1322708778u3rs.gif)
贵阳免费网站建设/企业营销策划
转载地址:http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html java中的多线程 在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。 对于直接继承Thread的类来说,代…...
![](https://img-blog.csdnimg.cn/4601f4b2aba24ef38f0bf14317da5759.png)
东营城乡建设信息网/seo查询 工具
题目描述 给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,‘e’,‘i’,‘o’,‘u’ ,在子字符串中都恰好出现了偶数次。 思路 ①由于问题…...
![](https://img-blog.csdnimg.cn/img_convert/494b0db330c89db0161a28f45c7cd2fd.jpeg)
租用域名与空间的网站并会使用/免费优化网站排名
如何学习算法的相关文章,大家估计也看过不少。每个人学算法的方法都不尽相同,这很正常。例如打 ACM 的玩家和不打比赛的玩家来说,训练的方式有不少差异,所以别人所说的学习方式,更多的是作为你的一种参考,包…...
![](/images/no-images.jpg)
户外网站建设/chrome网页版入口
Consul 介绍 社交电商平台源码请加企鹅求求:一零三八七七四六二六。Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与…...