Spring Boot中的bean注入方式和原理

news2024/12/29 10:54:25

Spring Boot是一个非常流行的Java框架,它可以帮助开发者快速地构建高效、健壮的应用程序。依赖注入是Spring Boo其中一个重要的功能,就是将一个对象注入到另一个对象中,以便它们可以相互协作。在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方法注入字段注入、和方法注入等。不同的注入方式适用于不同的场景,下面我们将逐一介绍这些注入方式。

2.1 构造函数注入

构造函数注入是最常用的注入方式之一。开发者可以在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对象了。

2.2 Setter方法注入

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

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

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

2.3 字段注入

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

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

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

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

2.4 方法注入

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

@Service
public class UserServiceImpl implements UserService {
    private UserRepository userRepository;
    
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    @Autowired
    public 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、事务管理、消息队列等。只有掌握了这些功能,才能开发出高效、健壮的应用程序。

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

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

相关文章

Python如何获取大量电影影评,做可视化演示

前言 《保你平安》今天上映诶,有朋友看过吗,咋样啊 这是我最近比较想看的电影了,不过不知道这影评怎么样,上周末的点映应该是有蛮多人看的吧,可以采集采集评论看过的朋友发出来的评论,分析分析 这周刚好…

2023年斋月倒计时,跨境卖家该如何做好选品和营销?

2023年斋月即将到来,这是一个伊斯兰教徒们非常重要的节日,同时也是跨境卖家们迎接销售高峰的时期。在2023年的斋月期间,跨境卖家应该如何做好选品和营销呢?本文Nox聚星将和大家好好聊一聊。 根据2022年的数据,斋月期间…

【巨人的肩膀】MySQL面试总结(一)

💪 目录💪1、什么是ER图2、数据库范式了解吗3、超键、候选键、主键、外键分别是什么?4、为什么不推荐使用外键与级联5、什么是存储过程6、drop、delete与truncate区别7、数据库设计通常分为那几步8、什么是关系型数据库9、什么是SQL10、MySQL…

SpringBoot整合Redis实现高并发数据缓存

目录什么是缓存为什么要用缓存Redis为什么这么快实现一个用户信息的缓存方式一:利用RedisTemplate实现导入依赖添加配置添加redis工具类及配置类开发mapper接口service层controller层测试方式二:采用SpringBoot注解开启缓存在启动类添加EnableCaching注解…

旋转框目标检测mmrotate v1.0.0rc1 之RTMDet训练DOTA的官方问题解析整理(四)

关于rotated_rtmdet_l-coco_pretrain-3x-dota_ms.py配置文件的batchsize和学习率设置问题:回答:如何在mmrotate中绘制特征图问题:回答:你好AllieLan,您可以尝试使用https://github.com/open-mmlab/mmyolo/blob/main/de…

Java Class 加密工具 ClassFinal

Jar包加密工具 ClassFinal介绍环境依赖使用说明下载加密命令行示例maven插件方式无密码模式机器绑定启动加密后的jar启动参数给密码不加密码参数直接启动1. 密码文件获取2. 交互输入参考资料介绍 ClassFinal 是一款 java class 文件安全加密工具,支持直接加密jar包…

KDHL-600A 回路电阻测试仪

一、产品概述 武汉凯迪正大KDHL-600A回路电阻测试仪是用于测量开关、断路器、变压器等设备的接触电阻、回路电阻的专用测试设备。其采用典型的四线制测量法,通过输出一个直流电流,施加于被测体的两个端钮之间,并测量电流流过被测体所产生的压…

Node.js简介

客户端访问网页时向服务器端发送请求要访问服务器中的页面,服务器收到请求后向数据库中进行搜索,搜索到相关数据然后返回结果给客户端显示; 这个过程就类似于:客人(客户端)去饭馆(服务端&#…

TryHackMe-VulnNet: Active(ez 域渗透)

VulnNet: Active VulnNet Entertainment在他们以前的网络中遇到了不好的时光,该网络遭受了多次破坏。现在,他们移动了整个基础架构,并再次聘请您作为核心渗透测试人员。您的目标是获得对系统的完全访问权限并破坏域。 这应该是我在thm打的最…

Uipath Excel 自动化系列15-Protect Sheet(保护工作表)

活动描述 Protect Sheet(保护工作表):在 Excel 中启用对指定工作表的保护,以便无法对其进行任何其他更改,该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 提示:Protect Sheet活动功能类似Excel文件【审阅】菜单栏下的保护工作簿功能&#…

TencentOS Server 安装 PostgreSQL

TencentOS 简介 2019 年,随着腾讯公司外部客户的需求,以及公司开源协同战略的推进,tlinux 对外开源并进行了品牌升级,升级为 TencentOS Server。TencentOS 包含三大场景,分别如下: TencentOS Server&…

MySQL DQL语句基础(一)

目录 DQL 基本语法 基础查询 1、查询多个字段 2、字段设置别名 3、去除重复记录 条件查询 语法 条件 案例 聚合函数 常见的聚合函数 语法 DQL DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。 基…

java面试-jvm

JVM JVM 是 java 虚拟机,简单来说就是能执行标准 java 字节码的虚拟计算机 JVM 是如何工作的 首先程序在执行之前先要把 Java 代码(.java)转换成字节码(.class),JVM 通过类加载器(ClassLoade…

Linux:创建守护进程,注册信号捕获回调函数,使用shell脚本代码管理守护进程

1.创建守护进程&#xff0c;编译时命名为a.out. 2.在守护进程中注册信号捕捉函数。 3.使用脚本发送自定义信号SIGUSR1给进程a.out。 4.守护进程捕获函数catchSignal&#xff08;&#xff09;捕捉到10号函数SIGUSR1退出进程。 创建守护进程代码&#xff1a; #include <stdi…

第八批国家药品集中采购-(附药品集采目录明细下载)

2023年3月2日&#xff0c;‘国家组织药品联合采购办公室’发出了《全国药品集中采购文件》&#xff0c;宣告了第八批国家组织药品集中采购工作正式开展&#xff0c;其公告中还包含三个附表分别为‘采购品种目录’、‘各地区首年约定采购量’、‘各采购品种首年约定采购量’&…

python for循环中 if else语句缩进对应问题

python for循环中 if else语句缩进对应问题 忙里偷闲&#xff0c;备考计算机二级&#xff0c;发现一个好玩的小知识&#xff0c;想分享一下自己当时的思考以及解决问题的过程 也许点进来的你会莫名其妙&#xff0c;if和else语句的缩进必须对齐&#xff0c;这不是连初学者都一…

【数据结构】带你深入理解栈

一. 栈的基本概念&#x1f4ab;栈是一种特殊的线性表。其只允许在固定的一端进行插入和删除元素的操作&#xff0c;进行数据的插入和删除的一端称作栈顶&#xff0c;另外一端称作栈底。栈不支持随机访问&#xff0c;栈的数据元素遵循后进先出的原则&#xff0c;即LIFO&#xff…

怎么把pdf转换成图片?这个方法你值得拥有

想要高效率的工作&#xff0c;除了需要大家合理安排时间之外&#xff0c;一些能够辅助高效工作的工具也是必不可少的。就拿要把一份pdf文件转换成若干图片来说&#xff0c;如果不知道方法&#xff0c;找不到合适的转换工具&#xff0c;那么想要完成这一任务&#xff0c;势必要花…

万里长征——基础IO

目录 文件常识 回顾C语言的文件操作 系统层面的文件操作 文件操作的本质 文件fd的分配规则及重定向 linux下一切皆文件 详谈缓冲区问题 文件常识 1、文件 文件内容 文件属性 2、空文件也要在磁盘上占据空间。因为空文件虽然内容为空&#xff0c;但它的属性也会占据空…

JVM学习笔记十:执行引擎

0. 前言 声明&#xff1a; 感谢尚硅谷宋红康老师的讲授。 感谢广大网友共享的笔记内容。 B站&#xff1a;https://www.bilibili.com/video/BV1PJ411n7xZ 本文的内容基本来源于宋老师的课件&#xff0c;其中有一些其他同学共享的内容&#xff0c;也有一些自己的理解内容。 1. …