Spring自动装配(特别版)

今天整理了一下Spring自动装配的过程,也突出了几个比较难以解答的问题.实践来求真知.

一. 自动装配过程

  1. 先按类型查找,若只有一个则直接返回
  2. 如果找到多个,则匹配名字
  3. 如果名字不一致,则报错.

二. 自动装配方式

构造器注入(推荐): 因为如果有一天脱离了Spring的环境,我们去使用这个自动注入的bean是,也可以通过他的构造函数来查看Bean之间的依赖关系

Setter注入:

三. 查看自动注入的几个特别现象

  1. 同时拥有同一类型的两个对象.

启动类测试

测试结果,报错,自动注入失败.

原因: 容器里有两个bean,回归自动装配过程,先按类型找找到两个bean,然后根据名称找发现person没有对应的对象,所以报错.

我们修改自动注入的名称为zhangsan试试.

测试结果,装配成功,对应着自动装配的过程,先按类型再按名称

  1. 相同类型存在两个bean,bean名称一致

测试结果为

这里注入了zhangsan那个bean,他是怎么确认是注入zhangsan这个bean的,在这种情形下是什么样的规则去注入呢?

我们尝试把person名称改成haha看是否有什么变化.

测试结果

发现还是注入了zhangsan那个bean.说明不是依靠这样的规则调整.

我们再尝试调换两个bean的声明顺序,看看是否会有变化

测试结果

发现自动注入的bean发生了改变,所以当出现两个bean类型相同,名称也相同时,spring优先注入先声明的bean.

但我们应该还知道一个primary注解,看看在这种情况会生效吗

测试结果

我们发现还是haha这个bean,说明Primary在此时是不起作用的.我们仔细深究一下Primary这个注解什么情况下才能使用.

我们把bean的name值去掉,尝试一下.

测试结果

说明Primary注解只在同类型存在多个bean时,指定一个bean为优先注入.而在同类型多个bean同名情况下不生效.

四. 几个特别的问题

1. 若多个bean名字相同时,如果注入到ioc容器,会产生什么情况

例如:

@Bean(name = "zhangsan")
public Person caca(){Person person = new Person("caca",2,"男");return person;
}
@Bean(name = "zhangsan")
public Person haha(){Person person = new Person("haha",2,"男");return person;
}

优先声明的注入的时候优先注入,也就是此时如果获取按名称获取zhangsan这个bean,将会提供person1这个对象.

获取对象

结果:

2. 假设有两个Bean,一个是单例的,一个是原型的,单例里面调了原型的,然后把这个单例注入到一个类,两次调单例的会是相同的对象嘛?相同的话,如何实现内部的原型的bean两次不同?

我们来实践看看会出现什么状态.

模拟一个单例,就用我们熟知的三层架构.controller层用来成为单例bean.

对于Service层的类,我们添加scope注解,将其变为原型类.

回到启动类,看看测试结果

发现了这两个bean是一样的,也就是说在单例bean的自动注入当中,哪怕你注入的是一个原型bean,他也仅仅只会注入一次.原型变成了单例.

这里是有一个常见的误解:单例Bean中的字段通常也是单例的,即使字段的类型是原型Bean。如果你将原型Bean注入到单例Bean的字段中,那么这个字段在单例Bean的生命周期内只会被初始化一次,也就是说,它实际上变成了单例的

那回答后面那一个问题,我们怎么实现内部两次不一样呢?

我们现在采取的是通过单例自动注入的方式,原型bean被注入了一次.而我们仔细想想,原型bean的特征是使用到他自己本身才创建一个新的bean. 所以,我们可以通过动态构建的方式来完成.也就是我们通过容器去拿,这样就可以达到我们的目的.

修改controller层代码

我们再启动我们的启动类,结果为

3. Primary 和 Qualifier加在同一个bean上,哪个优先级更高

Qualifier的优先级更高.会优先使用Qualifier指定名称标注的bean.

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣之612.平面上的最近距离

文章目录 1. 612.平面上的最近距离1.1 题目说明1.2 准备数据1.3 解法1.4 结果截图 1. 612.平面上的最近距离 1.1 题目说明 Point2D 表: ----------------- | Column Name | Type | ----------------- | x | int | | y | int | ----------------- (x, y) 是该表的…

Mac下载 安装MIMIC-IV 3.0数据集

参考blog MIMIC IV 3.0数据库安装方法_mimic数据下载-CSDN博客 MIMIC IV数据库安装(二)_mimic数据库安装-CSDN博客 MIMIC-IV3.0安装_mimic iv 3.0-CSDN博客 MIMIC-IV-v2.0安装教程_mimic iv 安装教程-CSDN博客 MIMIC IV 3.0数据库安装方法或者思路&…

java项目之教师工作量管理系统源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的教师工作量管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 教师工作量管理系统的…

12. MapReduce全局计数器

一. 计数器概述 在执行MapReduce程序时,控制台的输出中一般会包含如下内容。 这些输出就是MapReduce的全局计数器的输出信息。计数器是用来记录job的执行进度和状态的,它的作用可以理解为日志,方便用户了解任务的执行状况,辅助…

STM32F103C8T6 IO 操作

1.开启相关时钟 在 STM32 微控制器中,开启 GPIO 端口的时钟是确保 IO 口可以正常工作的第一步。 查找 RCC 寄存器使能时钟 在 STM32 中,时钟控制的寄存器通常位于 RCC (Reset and Clock Control) 模块中。不同的 STM32 系列(如 STM32F1、STM…

使用LangChain控制大模型的输出——解析器Parser

LangChain框架中有两个好用的工具: 提示词模板(PromptTemplate)用于指定LLM的输入,解析器(Parser)来正确解释LLM给出的输出 即: 提示词模板(PromptTemplate):用于格式化地接受输入string变量,作为完整的提示词。 如 给…

架构的本质之 MVC 架构

前言 程序员习惯的编程方式就是三步曲。 所以,为了不至于让一个类撑到爆💥,需要把黄色的对象、绿色的方法、红色的接口,都分配到不同的包结构下。这就是你编码人生中所接触到的第一个解耦操作。 分层框架 MVC 是一种非常常见且常…

VScode + PlatformIO 了解

​Visual Studio Code Visual Studio Code(简称 VS Code)是一款由微软开发且跨平台的免费源代码编辑器。该软件以扩展的方式支持语法高亮、代码自动补全(又称 IntelliSense)、代码重构功能,并且内置了工具和 Git 版本…

微信公众号(或微信浏览器)获取openId(网页授权)

下单支付需要openId 首先授权去拿到code --然后调用后太换取openId 1.去拿取code 下图中执行到window.location.href ( redirect_uri 传入当前路径-)–执行后重新跳转到当前页面–但是路径上会带上code参数 //然后调用后台方法–将code传给后台得到 o…

Steam deck 倒腾日记 - 安装Windows软件,玩上黑神话悟空

Steam deck 倒腾日记 关于Steam Deck基本信息性能特点游戏兼容性 问题一: 软键盘输入问题二: 系统切换问题三: 安装运行Window 软件关于Proton如何运行 问题四: 优化网络问题黑神话.悟空PS参考 关于Steam Deck Steam Deck是一款由Valve开发的便携式游戏PC,它搭载了A…

人工智能的前世今生:从幻想走向现实

在科技飞速发展的今天,人工智能(AI)已经成为我们生活中不可或缺的一部分。从智能手机的语音助手到自动驾驶汽车,AI的应用无处不在。但是,人工智能的发展历程并非一帆风顺,它经历了从兴起、寒冬到复兴的曲折…

ARM base instruction -- bfc

Bitfield Clear sets a bitfield of <width> bits at bit position <lsb> of the destination register to zero, leaving the other destination bits unchanged. 位域清除将目标寄存器位位置<lsb>处<width>位的位域设置为零&#xff0c;而保留其他目…

预处理详解(一)

目录 预定义符号define定义常量define定义宏宏替换的规则宏与函数的对比 预定义符号 C语⾔设置了⼀些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇…

2024-10-30 学习人工智能的Day18

Python包和模块 当使用Python编程时&#xff0c;包&#xff08;Packages&#xff09;和模块&#xff08;Modules&#xff09;是两个关键的概念&#xff0c;它们有助于组织、管理和复用代码。 1. 模块&#xff08;Modules&#xff09; 1.1 什么是模块 一个.py 文件就是一个模…

从 TCP 友好性看传输优化

再看一遍最传统 TCP AIMD 吞吐的推导&#xff1a; 这个积分用离散求和表示很简单&#xff0c;一个锯齿发送的报文总数为&#xff1a; ( W 2 0 ) ( W 2 1 ) ( W 2 2 ) . . . ( W 2 ( W − W 2 ) ) ≈ 3 ⋅ W 2 8 (\dfrac{W}{2}0)(\dfrac{W}{2}1)(\dfrac{W}{2}2)...(\df…

css 对称按钮,中间斜平行间隔,两头半圆

序&#xff1a;稍一看&#xff0c;挺好看&#xff0c;看也简单&#xff0c;实现起来应该也是一样&#xff0c;没什么难度&#xff0c;分分钟完成。后面将其他的UI做了七七八八后&#xff0c;到这个按钮的时候&#xff0c;不知怎么&#xff0c;突然卡机了&#xff0c;想不起来怎…

DDRPHY数字IC后端设计实现系列专题之后端设计导入,IO Ring设计

本章详细分析和论述了 LPDDR3 物理层接口模块的布图和布局规划的设计和实 现过程&#xff0c;包括设计环境的建立&#xff0c;布图规划包括模块尺寸的确定&#xff0c;IO 单元、宏单元以及 特殊单元的摆放。由于布图规划中的电源规划环节较为重要&#xff0c; 影响芯片的布线资…

几种因素对磁控溅射AlN薄膜择优取向的影响

几种因素对磁控溅射AlN薄膜择优取向的影响 AlN材料在微电子产业中有广泛的应用&#xff0c;AlN薄膜在多种器件中都扮演着重要角色。 晶体生长中的择优取向是指在多晶材料中&#xff0c;晶粒沿着某一特定晶向或晶面生长得更快或更优先的现象。这种取向通常与材料的制备工艺和生长…

基于Java SpringBoot和Vue社区医院诊所医疗挂号管理系统设计

摘要 本文旨在设计并实现一个基于Java SpringBoot和Vue的社区医院管理系统&#xff0c;以解决当前社区医院管理中存在的效率低下、数据安全性差等问题。通过采用前后端分离架构&#xff0c;系统实现了用户信息管理、挂号管理、医生管理等功能模块&#xff0c;有效提升了医院的…

Linux 基础io_ELF_虚拟物理地址_动态库加载

1.可执行程序格式 ELF [wwshcss-ecs-178e myshell]$ ll total 56 -rw-rw-r-- 1 wws wws 92 Oct 17 19:14 file -rw-rw-r-- 1 wws wws 82 Oct 12 16:51 makefile -rw-r--r-- 1 wws wws 90 Oct 17 19:13 myfile -rwxrwxr-x 1 wws wws 20128 Oct 16 21:02 myshell -rw-r…