Spring Boot 中的 Bean

news2025/4/9 13:32:07

2025/4/6

向全栈工程师迈进!

一、Bean的扫描

在之前,对于Bean的扫描,我们可以在XML文件中书写标签,来指定要扫描的包路径,如下所示,可以实通过如下标签的方式:

<context:component-scan base-package="com.example"/>

也可以是通过如下注解的方式

@ComponentScan(basePackage="com.example")

但是在实际的Spring Boot 是通过注解的方式

但是可以发现注解并不相同 ,Spring Boot使用的@SpringBootApplication注解,那为何什么该注解可以让其找到要注入对象的存放路径呢?原因如下@SpringBootApplication是一个组合路径。是包括下面三种的。

但是也没有在ComponentScan中写明路径,那如何找到呢,其实是因为该注解是表明自动的扫描启动类所在的包极其子包。

所以这些会被成功的注入到IOC容器当中,通过如下访问,也确实可以访问到。

当我们将controller移走

此时再去访问,就已经找不到了。因为controller包并不是启动类的所在的包极其子包中,所以boot工程扫描不打了。

 如果非要让boot工程能够扫描到这个controller的话,我们可以通过注解来实现。使用

@ComponentScan(basePackages = "com.example")

表示从example包开始扫描,下面的蓝色框住的表示启动类默认扫描的范围。 

当通过注解将其扫描的范围扩大到了从example开始,我们再次尝试访问,看是否成功。

 虽然可以手动扩大扫描的范围,但是一般不建议这么做。

二、Bean注册

接下去我们看看哪些注解会扫描到并被解析,从而把对应的bean对象注入到IOC容器里面,例如以下,我们可以在类上添加以下注解实现将该类添加到IOC容器中。

如果要注册的bean对象来自于第三方(不是自定义的),我们是无法同@Component极衍生注解声明bean的。Sprig提供了 @Bean 和 @Import 来满足这种需求。

制作了一个演示的jar包,叫做common-pojo-1.0-SNAPSHOT.jar,首先将这个包引入

在本地安装好后,在pom.xml文件中引入,如下所示。 

 

  写入后,刷新一下,就可以找到该jar包,该jar包中有两个实体类对象,一个Country,一个Province。接下去我们就来实现将这两个对象注入IOC容器。

 2.1 @Bean

通过@Bean注解来注入,如下当加入@Bean注解后就可以自动的将返回的对象注入到IOC容器当中。

测试是否真的被注入,如下所示,真的在容器里找到了被注入的country对象。

但是在启动类中这样干是不推荐的,一般将其写到特定的配置类当中,完全用于注册bean对象的类中。可以定义一个CommonConfig用于专门定义这个。

在配置类中,我们通过@Bean注入这两个对象 

同样的成功获取到了

2.2 @Import(xxx.class) 直接导入类。

只要在启动类上添加@Import(xxx.class)注解,就可以注入对应的类,可以是任何类,也可以是一个配置类,但是在实际的开发过程中,我们更常用的是导入配置类或者是导入ImportSelector接口的实现类

导入配置类

但是加入要导入的类过多,就会导致其要写很多的import,这显然不是良好的编程风格。所以我们可以使用第二种导入ImportSelector接口实现类的方式。

然后直接导入接口的实现类,就可以实现如上效果。

三、注册条件

在前面我们是学习通过@Bean和@Import的方式来注入,但是在之前注入的对象中,都是没有复制过的,我们可以在注册前就赋好值,然后再注入就可以很好的解决这个问题了

但这些信息是被写在java代码中的,要是哪天这些信息需要更改的话,就得重新改java代码,所以对于这类信息我们可以写在配置文件中,通过配置文件获取,然后需要更改的话,只需要更改配置文件中的信息即可。

但是假设在配置文件中并没有country.name的值,那么就会报错,若想要实现,若在配置文件中没有找到country.name和country.system的值的话,那就不注入这个country对象,所以这里就需要用到注入条件来实现。

通过@Conditional来设置注解条件

不要小看走的每一步!

2025/4/6 

 

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

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

相关文章

ST 芯片架构全景速览:MCU、无线 SoC、BLE 模块、MPU 差异详解

在嵌入式开发中,ST 是一个非常常见的芯片厂商,其产品线覆盖了 MCU、无线芯片、BLE 模块以及运行 Linux 的 MPU 等多个领域。很多开发者初次接触 ST 时会对这些产品之间的关系感到困惑。 本文从分类视角出发,带你快速了解 ST 芯片家族的核心架构和主要用途。 🧭 ST 芯片四…

AtCoder Beginner Contest 400(ABCDE)

A - ABC400 Party 翻译&#xff1a; 在 ABC400 的纪念仪式上&#xff0c;我们想把 400 人排成 A 行 B 列的长方形&#xff0c;且不留任何空隙。 给你一个正整数 A&#xff0c;请打印可以这样排列的正整数 B 的值。如果没有这样的正整数 B&#xff0c;则打印-1。 思路&#xff…

Flask+Vue构建图书管理系统及Echarts组件的使用

教程视频链接从零开始FlaskVue前后端分离图书管理系统 后端 项目下载地址 其中venv为该项目的虚拟环境&#xff0c;已安装所有依赖 使用方法&#xff1a; 在pycharm终端中flask create一下&#xff08;因为写了一个自定义命令的代码&#xff09;&#xff0c;初始化books数据…

【项目管理】第2章 信息技术发展 --知识点整理

Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 对应:第1章-第5章 (二)知识笔记 二、信息技术的发展 1. 信息技术及其发展 1)计算机软硬件 计算机硬件由电子机械、光电元件等组成的物理装置,提供物质基础给计算机软件运行。软件包括程…

4-c语言中的数据类型

一.C 语⾔中的常量 1.生活中的数据 整数&#xff1a; 100,200,300,400,500 小数: 11.11 22.22 33.33 字母&#xff1a; a&#xff0c;b&#xff0c;c&#xff0c;d A&#xff0c;B&#xff0c;C&#xff0c;D 在 C 语⾔中我们把字⺟叫做字符. 字符⽤单引号引⽤。例如A’ 单词…

LORA+llama模型微调全流程

LORAllama.cpp模型微调全流程 准备阶段 1.下载基础大模型 新建一个download.py脚本 from modelscope import snapshot_download#模型存放路径 model_path /root/autodl-tmp #模型名字 name itpossible/Chinese-Mistral-7B-Instruct-v0.1 model_dir snapshot_download(na…

Spring 执行流程(源码)

我们对SpringApplication中的run()方法内部进行一些简单的分析 1. //记录一下程序启动开始的事件&#xff0c;用于之后的统计耗时 long startTime System.nanoTime(); //通过调用SpringApplication的**createBootstrapContext()**方法&#xff0c;创建**bootstrapContext**…

安装完 miniconda3 ,cmd无法执行 conda 命令

提示&#xff1a;安装 miniconda3 文章目录 前言一、安装二、安装完&#xff0c;cmd 无法执行 conda 前言 提示&#xff1a;版本 系统&#xff1a;win10 codna: miniconda3 安装完 miniconda3 &#xff0c;cmd无法执行 conda 命令 提示&#xff1a;以下是本篇文章正文内容&am…

Docker快速安装MongoDB并配置主从同步

目录 一、创建相关目录及授权 二、下载并运行MongoDB容器 三、配置主从复制 四、客户端远程连接 五、验证主从同步 六、停止和恢复复制集 七、常用命令 一、创建相关目录及授权 创建主节点mongodb数据及日志目录并授权 mkdir -p /usr/local/mongodb/mongodb1/data mkdir …

Golang系列 - 内存对齐

Golang系列-内存对齐 常见类型header的size大小内存对齐空结构体类型参考 摘要: 本文将围绕内存对齐展开, 包括字符串、数组、切片等类型header的size大小、内存对齐、空结构体类型的对齐等等内容. 关键词: Golang, 内存对齐, 字符串, 数组, 切片 常见类型header的size大小 首…

网络原理 - HTTP/HTTPS

1. HTTP 1.1 HTTP是什么&#xff1f; HTTP (全称为 “超文本传输协议”) 是⼀种应用非常广泛的应用层协议. HTTP发展史&#xff1a; HTTP 诞生于1991年. 目前已经发展为最主流使用的⼀种应用层协议 最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经…

OCC Shape 操作

#pragma once #include <iostream> #include <string> #include <filesystem> #include <TopoDS_Shape.hxx> #include <string>class GeometryIO { public:// 加载几何模型&#xff1a;支持 .brep, .step/.stp, .iges/.igsstatic TopoDS_Shape L…

深度学习入门(四):误差反向传播法

文章目录 前言链式法则什么是链式法则链式法则和计算图 反向传播加法节点的反向传播乘法节点的反向传播苹果的例子 简单层的实现乘法层的实现加法层的实现 激活函数层的实现ReLu层Sigmoid层 Affine层/SoftMax层的实现Affine层Softmax层 误差反向传播的实现参考资料 前言 上一篇…

Linux:页表详解(虚拟地址到物理地址转换过程)

文章目录 前言一、分页式存储管理1.1 虚拟地址和页表的由来1.2 物理内存管理与页表的数据结构 二、 多级页表2.1 页表项2.2 多级页表的组成 总结 前言 在我们之前的学习中&#xff0c;我们对于页表的认识仅限于虚拟地址到物理地址转换的桥梁&#xff0c;然而对于具体的转换实现…

PostgreSQL 一文从安装到入门掌握基本应用开发能力!

本篇文章主要讲解 PostgreSQL 的安装及入门的基础开发能力,包括增删改查,建库建表等操作的说明。navcat 的日常管理方法等相关知识。 日期:2025年4月6日 作者:任聪聪 一、 PostgreSQL的介绍 特点:开源、免费、高性能、关系数据库、可靠性、稳定性。 官网地址:https://w…

WEB安全--内网渗透--LMNTLM基础

一、前言 LM Hash和NTLM Hash是Windows系统中的两种加密算法&#xff0c;不过LM Hash加密算法存在缺陷&#xff0c;在Windows Vista 和 Windows Server 2008开始&#xff0c;默认情况下只存储NTLM Hash&#xff0c;LM Hash将不再存在。所以我们会着重分析NTLM Hash。 在我们内…

8.用户管理专栏主页面开发

用户管理专栏主页面开发 写在前面用户权限控制用户列表接口设计主页面开发前端account/Index.vuelangs/zh.jsstore.js 后端Paginator概述基本用法代码示例属性与方法 urls.pyviews.py 运行效果 总结 欢迎加入Gerapy二次开发教程专栏&#xff01; 本专栏专为新手开发者精心策划了…

室内指路机器人是否支持与第三方软件对接?

嘿&#xff0c;你知道吗&#xff1f;叁仟室内指路机器人可有个超厉害的技能&#xff0c;那就是能和第三方软件 “手牵手” 哦&#xff0c;接下来就带你一探究竟&#xff01; 从技术魔法角度看哈&#xff1a;好多室内指路机器人都像拥有超能力的小魔法师&#xff0c;采用开放式…

从代码上深入学习GraphRag

网上关于该算法的解析都停留在大概流程上&#xff0c;但是具体解析细节未知&#xff0c;由于代码是PipeLine形式因此阅读起来比较麻烦&#xff0c;本文希望通过阅读项目代码来解析其算法的具体实现细节&#xff0c;特别是如何利用大模型来完成图谱生成和检索增强的实现细节。 …

【Redis】通用命令

使用者通过redis-cli客户端和redis服务器交互&#xff0c;涉及到很多的redis命令&#xff0c;redis的命令非常多&#xff0c;我们需要多练习常用的命令&#xff0c;以及学会使用redis的文档。 一、get和set命令&#xff08;最核心的命令&#xff09; Redis中最核心的两个命令&…