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

SpringBoot中的bean注入方式和原理介绍

Spring Boot是一个非常流行的Java框架,它可以帮助开发者快速地构建高效、健壮的应用程序。其中一个重要的功能就是依赖注入,也就是将一个对象注入到另一个对象中,以便它们可以相互协作。在Spring Boot中,依赖注入是通过bean实现的,本文将介绍Spring Boot中的bean注入方式和原理。

 

什么是Bean

在Spring Boot中,Bean是一个被Spring容器管理的Java对象。当Spring容器启动时,它会读取应用程序的配置文件(如application.properties或application.yml)并创建所有的Bean。开发者可以在配置文件中定义Bean,也可以使用注解的方式定义Bean。定义Bean的方式多种多样,包括XML配置文件、Java配置类、注解等。

Spring Boot的Bean是单例的,也就是说,只会创建一个实例,然后在需要的地方共享使用。当应用程序启动时,Spring容器会根据定义的规则来创建所有的Bean,并将它们存储在容器中。在应用程序运行期间,其他组件可以通过Spring容器获取这些Bean,并使用它们。

Bean注入方式

Spring Boot提供了多种方式来注入Bean,包括构造函数注入、Setter方法注入、字段注入、和方法注入等。不同的注入方式适用于不同的场景,下面我们将逐一介绍这些注入方式。

构造函数注入

构造函数注入是最常用的注入方式之一。开发者可以在Bean类的构造函数中声明需要注入的Bean,并在应用程序启动时,Spring容器会自动将这些Bean注入到构造函数中。下面是一个简单的示例:

@Service
public class UserServiceImpl implements UserService {private final UserRepository userRepository;public UserServiceImpl(UserRepository userRepository) {this.userRepository = userRepository;}// ...
}

在上面的例子中,UserServiceImpl类的构造函数中包含了一个UserRepository类型的参数。在应用程序启动时,Spring容器会自动将UserRepository对象注入到构造函数中。这样,UserService就可以使用UserRepository对象了。

Setter方法注入

Setter方法注入是另一种常用的注入方式。开发者可以在Bean类中定义Setter方法,并使用@Autowired注解将需要注入的Bean作为参数传入。Spring容器会自动调用这些Setter方法,并将Bean注入到它们中。下面是一个示例:

typescriptCopy code@Service
public class UserServiceImpl implements UserService {private UserRepository userRepository;@Autowiredpublic void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}// ...
}

在上面的例子中,UserServiceImpl类中包含了一个名为setUserRepository的Setter方法,并使用@Autowired注解将UserRepository对象作为参数传入。在应用程序启动时,Spring容器会自动调用setUserRepository方法,并将UserRepository对象注入到它中。

字段注入

字段注入是一种不太常用的注入方式,它使用@Autowired注解直接将需要注入的Bean注入到类的字段中。下面是一个示例:

@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserRepository userRepository;// ...
}

在上面的例子中,UserServiceImpl类中包含了一个UserRepository类型的字段,并使用@Autowired注解将UserRepository对象注入到它中。在应用程序启动时,Spring容器会自动将UserRepository对象注入到该字段中。

需要注意的是,字段注入有一定的限制,它不能注入final字段和静态字段。

方法注入

方法注入是一种比较灵活的注入方式,开发者可以在Bean类中定义一个方法,并使用@Autowired注解将需要注入的Bean作为参数传入。Spring容器会自动调用这个方法,并将Bean注入到它中。下面是一个示例:

@Service
public class UserServiceImpl implements UserService {private UserRepository userRepository;@Autowiredpublic void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}@Autowiredpublic void init() {// ...}// ...
}

在上面的例子中,UserServiceImpl类中定义了一个名为init的方法,并使用@Autowired注解将UserRepository对象作为参数传入。在应用程序启动时,Spring容器会自动调用这个方法,并将UserRepository对象注入到它中。

Bean注入原理

Spring Boot的Bean注入是通过反射机制实现的。在应用程序启动时,Spring容器会读取应用程序的配置文件,并根据配置文件中定义的规则来创建Bean。当容器创建Bean时,它会检查Bean类中是否包含被注入的属性或方法,并根据属性或方法的注解信息来确定要注入的对象。

在注入对象时,Spring容器首先会查找与该对象类型匹配的Bean,如果找到了多个匹配的Bean,则会根据被注入的属性或方法上的@Qualifier注解来确定要注入的Bean。如果没有找到匹配的Bean,则会抛出NoSuchBeanDefinitionException异常。

需要注意的是,Spring容器中的Bean是单例的,也就是说,只会创建一个实例,并在需要的地方共享使用。当一个Bean被注入到另一个Bean中时,它实际上是将这个Bean的引用注入到另一个Bean中,而不是创建一个新的实例。

总结

Spring Boot的Bean注入是一个非常重要的功能,它可以帮助开发者快速地构建高效、健壮的应用程序。本文介绍了Spring Boot中的Bean注入方式和原理,包括构造函数注入、Setter方法注入、字段注入和方法注入等。了解这些注入方式和原理,可以帮助开发者更好地理解Spring Boot的Bean注入机制,从而在开发过程中更加灵活地使用它。

需要注意的是,在使用Bean注入时,开发者应该注意Bean的作用域和生命周期。Spring Boot中默认的作用域是单例模式,也就是说,一个Bean在容器中只有一个实例。如果需要使用其他作用域,例如原型模式或会话作用域等,需要使用@Scope注解来指定。

另外,在应用程序关闭时,Spring容器会自动销毁所有的Bean。如果开发者需要在销毁Bean之前执行某些操作,例如释放资源或关闭连接等,可以使用@PreDestroy注解来标注一个方法,该方法会在Bean销毁之前被调用。

最后,需要注意的是,Bean注入只是Spring Boot中的一个小功能,要想充分发挥Spring Boot的优势,还需要掌握其他重要的功能,例如AOP、事务管理、消息队列等。只有掌握了这些功能,才能开发出高效、健壮的应用程序。

结论

在Spring Boot中,Bean注入是一种非常重要的功能,它可以帮助开发者快速构建高效、健壮的应用程序。本文介绍了Spring Boot中Bean注入的基本概念、注入方式和原理,包括构造函数注入、Setter方法注入、字段注入和方法注入等。同时,本文还介绍了Bean的作用域和生命周期等相关知识。通过本文的学习,相信读者已经对Spring Boot中的Bean注入有了更深入的了解,能够更加灵活地使用Bean注入来开发高效、健壮的应用程序。

 

相关文章:

SpringBoot中的bean注入方式和原理介绍

Spring Boot是一个非常流行的Java框架,它可以帮助开发者快速地构建高效、健壮的应用程序。其中一个重要的功能就是依赖注入,也就是将一个对象注入到另一个对象中,以便它们可以相互协作。在Spring Boot中,依赖注入是通过bean实现的…...

ESP32设备驱动-RFID-RC522模块驱动

RFID-RC522模块驱动 文章目录 RFID-RC522模块驱动1、RFID-RC522介绍2、硬件准备3、软件准备4、驱动实现1、RFID-RC522介绍 基于 NXP 的 MFRC522 IC 的 RC522 RFID 模块通常带有一个 RFID 卡标签和具有 1KB 内存的密钥卡标签。 最重要的是,它可以写一个标签,这样你就可以在里…...

SMETA认证有些客户是需要做窗口期的

【SMETA认证有些客户是需要做窗口期的】SMETA审核是常见的社会责任审核标准之一,中文全称为“Sedex 会员道德贸易审核”,英文为“Sedex Members Ethical Trade Audit”. SEDEX 官网:网页链接Sedex 作为目前市场流行的CSR审核标准,…...

面向对象设计模式:创建型模式之原型模式

文章目录一、引入二、代理模式,Prototype Pattern2.1 Intent 意图2.2 Applicability 适用性2.3 类图2.4 应用实例:使用下划线或消息框展示字符串2.4 应用实例:JDK java.lang.Object java.lang.Cloneable一、引入 二、代理模式,Pr…...

三维重建(单目、双目、多目、点云、SFM、SLAM)

1 相机几何与标定1.1 相机模型中的坐标系1.2 四种坐标系之间的转换1.3 相机内参1.4 相机标定2 单目三维重建2.1 NeuralRecon三维重建定义 在计算机视觉中, 三维重建是指根据单视图或者多视图的图像重建三维信息的过程. 由于单视频的信息不完全,因此三维重建需要利用经验知识. 而…...

Java中的final和权限修饰符

目录 final 常量 细节: 权限修饰符 Java权限修饰符用于控制类、方法、变量的访问范围。Java中有四种权限修饰符: 权限修饰符的使用场景: final 方法 表明该方法是最终方法,不能被重写。类 表明该类是最终类,不能被继…...

MySQL的基本语句(SELECT型)

基本MySQL语句SELECTSELECT FROM 列的别名去除重复行空值着重号算术运算符加法( )减法( - )乘法( * )除法&#xff08; / 或DIV)求模&#xff08; % 或MOD)比较运算符等于&#xff08; &#xff09;安全等于&#xff08; <> &#xff09;不等于&#xff08; ! 或 <…...

日志服务搭建-ES-FileBeat-Kibana

1次订单量突增问题&#xff0c;导致了有几个数据没有录库&#xff0c;但是确有支付的记录&#xff0c;啥玩意&#xff0c;还能有这个操作&#xff0c;组内安排问题定位&#xff0c;解决&#xff0c;一看打出来的日志&#xff0c;只有支付有&#xff0c;生成订单这边没有&#x…...

大数据架构设计与数据计算流程

大数据架构设计Hadoop有3个核心组件&#xff1a;分布式文件系统HDFS&#xff1b;分布式运算编程框架MapReduce&#xff1b;分布式资源调度平台YARN。HBase&#xff0c;Hadoop dataBase&#xff0c;基于HDFS的NoSQL数据库&#xff0c;面向列式的内存存储&#xff0c;定期将内存数…...

207. 课程表

207. 课程表https://leetcode.cn/problems/course-schedule/ 难度中等1526 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [a…...

2023-03-08 mysql列存储数据库-查询执行过程分析

摘要: 在mysql的sql层和存储引擎的交互模式中, 存储引擎实现handler接口, 由SQL层负责调用接口, 所以执行的过程可以看作是在sql层中, innodb仅提供接口。 但是在mysql列存储引擎中, TMD直接替换掉了sql层的执行接口,并且将sql层的查询树转换成了自己的一套查询树, 然后根据…...

各种激活函数的计算公式、图像以及实现代码

激活函数已经成为神经网络中非常重要的一部分&#xff0c;随着各种类型的神经网络模型被人们开发出来&#xff0c;各种激活函数也应运而生&#xff0c;在不同的场景中&#xff0c;取得良好的效果。本文跟据著名的YOLO系列目标检测模型的源码 AlexeyAB Darknet&#xff0c;整理出…...

ArangoDB

介绍 ArangoDB 是一个原生的多模型开源数据库&#xff0c;具有灵活的文档、图形和键值数据模型。使用方便的类似 SQL 的查询语言或 JavaScript 扩展构建高性能应用程序。主要特点 在集群上安装 ArangoDB —— 安装简单灵活的数据建模&#xff1a;数据建模为键值对、文档或图表的…...

MySQL8.0Linux安装及主从的搭建

MySQL8.0Linux安装教程 下载并安装 需要说明的一点是我使用的是SSH secure shell Client连接linux系统的&#xff0c;它的用法和命令窗口差不多。界面如图&#xff1a;一样的使用Linux命令操作。 话不多说 第一步&#xff1a; 1&#xff09;、切换到 /usr/local下 cd /usr/…...

苹果新专利实现无线技术传输睡眠数据,蓝牙在智能家居中的应用

苹果于 2017 年 5 月收购了芬兰科技公司 Beddit&#xff0c;只是在过去 6 年时间里并没有太大的动作。根据美国商标和专利局本周公示的清单&#xff0c;苹果获得了一项 Beddit 相关的技术专利。 根据专利描述&#xff0c;苹果使用一根或者多根天线&#xff0c;利用电磁辐射的…...

银行数字化转型导师坚鹏:数字化转型为什么需要致良知与知行合一

在银行数字化转型过程中&#xff0c;特别需要致良知与知行合一哲学思想的指导。 知中有行&#xff0c;行中有知&#xff1b;行极而知&#xff0c;知极而行&#xff1b;知行无端&#xff0c;知行无始。知与行是一件事&#xff0c;做事与培养本体&#xff08;修心&#xff09;也是…...

Web前端学习:章三 -- JavaScript预热(二)

六五&#xff1a;作用域与function function&#xff1a;函数&#xff0c;不是数学上的函数&#xff0c;与写代码有关 JS中的函数&#xff1a;运用它&#xff0c;起个名字&#xff0c;然后对函数进行调用&#xff0c;即可将函数中的内容执行一遍 1、function 最基本的作用域…...

Excel绘制数据对比表格-表格可视化

Word中生成的表格一般比较单调&#xff0c;若一组数据存在对比的情况时&#xff0c;读者/审稿人难以直接通过详细对比数据来分析&#xff0c;此时若可以将该组数据可视化来对比则为好&#xff0c;Excel则可实现该功能。 关于有些期刊需要提供表格中的数据便于复制等情况时&…...

究竟是谁负了谁,来自底层测试的2022年终总结

前言 说实话坐在椅子前&#xff0c;都想好了&#xff0c;该怎么去写&#xff0c;甚至感觉有好多要写的&#xff0c;但是当我坐在椅子上时&#xff0c;却不知道该怎么开头了&#xff0c;不知道是不是紧张&#xff1f;还是不舍&#xff1f;难道还没有跟过去挥手告别的勇气吗&…...

C++——IO流

目录 C语言的输入与输出 流是什么 CIO流 C标准IO流 C文件IO流 二进制读写 文本读写 stringstream的简单介绍 C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键 盘)读取数据&#xff0c;并将值存放在变量中。…...

网络 | UDP与TCP协议讲解 | TCP可靠性是怎样实现的?

文章目录前置知识查看网络状态的工具查看进程idUDP协议协议格式UDP只有接收缓冲区基于UDP的应用层协议TCP协议流的理解协议格式确认应答机制缓冲区序号的作用流量控制超时重传机制6位标志位紧急数据的处理三次握手listen的第二个参数全连接和半连接队列都维护了什么信息&#x…...

JavaEE——简单介绍Thread类以及线程的基本操作

文章目录一、Thread 类中的常见构造方法二、Thread 的一些常见属性三、线程的启动——start()isAlive() 方法的解释四、线程中断五、线程等待-join()了解六、简单解释线程休眠一、Thread 类中的常见构造方法 我们已知&#xff0c;Thread 类是Java中多线程中的一个关键类&#…...

Java的数据库编程:JDBC

Content &#x1f389;1什么是API &#x1f389;2.什么是JDBC &#x1f389;3.数据库驱动包的安装 &#x1f389;4.数据库安装包在idea的使用 &#x1f389;5.JDBC的增删改查的简单实现 今天为大家带来JAVA的数据库编程,也就是用Java实现数据库 数据库的最基本的操作就是…...

蓝桥冲刺31天之第六天

今天是摆子的一天&#xff0c;明天我要肝一整天的第四题&#xff01;&#xff01;&#xff01; PS&#xff1a;一个普通的排序罢了 import java.io.*; import java.util.Arrays; import java.util.Scanner;/*** ClassName 考勤刷卡* Description TODO* Author 小怂很怂* Date 2…...

Streamlit 工具记录

Streamlit 是基于 Python 的 Web 应用程序框架&#xff0c;可视化数据&#xff0c;分析结果。 Streamlit 是一个开源库&#xff0c;可在短时间内开发机器学习可视化仪表板。只需几行代码就可以构部署强大的数据应用程序。Streamlit 可将仪表板的开发时间从几天缩短至几小时。 …...

GreenPlum小结

什么是GreenPlum&#xff1f;GreenPlum是业界最快最高性价比的关系型分布式数据库,它在开源的PostgreSQL的基础上采用MPP架构&#xff08;Massive Parallel Processing&#xff0c;海量并行处理&#xff09;,具有强大的大规模数据分析任务处理能力。GreenPlum作为大数据融合存储…...

C语言中数组和指针

文章目录前言一、指针的概念二、指针的大小三、指针的用法1.指针指向变量2.指针指向数组3.指针指向函数总结前言 本文将给大家带来C语言中非常重要的两个知识点&#xff0c;指针和数组。 一、指针的概念 指针&#xff0c;是C语言中的一个重要概念及其特点&#xff0c;也是掌…...

Leetcode.剑指 Offer II 022 链表中环的入口节点

题目链接 Leetcode.剑指 Offer II 022 链表中环的入口节点 mid 题目描述 给定一个链表&#xff0c;返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next指针进入环的第一个节点为环的入口节点。如果链表无环&#xff0c;则返回 null。 为了表示给定链表中的环&#…...

4种不同编程语言的打印方式

意义 打印方式是编程中不可或缺的一部分&#xff0c;它可以帮助开发人员有效地调试和测试代码&#xff0c;并提供有用的信息来监视程序的运行状态和性能。 编程语言中的打印方式是指将程序输出到终端或控制台上进行显示。这个功能在编程中非常重要&#xff0c;因为它可以帮助开…...

websocket介绍

我们聊聊轮询技术,什么是轮询?轮询就是在特定的时间间隔,由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。 轮询分为两种: 短轮询:通过不断的向服务端发送数据,客户端发送Request,服务端直接返回Response(不管服务端数据有没有改变)。长轮…...