佛山网站开发/网络营销薪酬公司

佛山网站开发,网络营销薪酬公司,广州整合营销,自己做app建网站搞个引言 在 Spring 框架的开发中,依赖注入(Dependency Injection,简称 DI)是它的一个核心特性,它能够让代码更加模块化、可测试,并且易于维护。而 Autowired 注解作为 Spring 实现依赖注入的关键工具&…

搞个引言

在 Spring 框架的开发中,依赖注入(Dependency Injection,简称 DI)是它的一个核心特性,它能够让代码更加模块化、可测试,并且易于维护。而 @Autowired 注解作为 Spring 实现依赖注入的关键工具,给咱们开发者提供了极大的便利。本文将通过具体的示例详细介绍 @Autowired 注解的多种使用场景,帮助你更好地掌握这一重要注解~

一、构造函数注入

1.1 基本原理

当一个类依赖于其他 Bean 时,使用 @Autowired 注解在构造函数上进行依赖注入是一种推荐的方式。这种方式能保证对象在创建时其依赖项就已经被正确初始化,符合依赖项不变性原则。也就是说,对象一旦创建完成,其依赖的 Bean 就不会再改变了。

1.2 示例代码

// 定义一个服务接口
interface UserService {void saveUser();
}// 实现服务接口
class UserServiceImpl implements UserService {@Overridepublic void saveUser() {System.out.println("User saved.");}
}// 定义一个控制器类,依赖 UserService
class UserController {private final UserService userService;// 使用 @Autowired 注解在构造函数上进行依赖注入@Autowiredpublic UserController(UserService userService) {this.userService = userService;}public void handleSaveUser() {userService.saveUser();}
}

1.3 代码解释

在上述代码中,UserController 类依赖于 UserService 接口的实现类。通过在构造函数上使用 @Autowired 注解,Spring 容器会自动查找 UserService 类型的 Bean,并将其注入到 UserController 的构造函数中。这样,在创建 UserController 对象时,userService 字段就已经被正确初始化,后续可以直接使用。

1.4 使用优势

  • 依赖不可变:使用构造函数注入,一旦对象创建完成,其依赖的 Bean 就不会再改变,保证了对象状态的一致性。
  • 便于单元测试:在进行单元测试时,可以方便地通过构造函数传入模拟对象,提高代码的可测试性。

二、Setter 方法注入

2.1 基本原理

除了构造函数注入,@Autowired 注解还可以用于 Setter 方法上。这种方式允许在对象创建后动态地注入依赖项,适用于一些依赖项可能会在对象生命周期内发生变化的场景。

2.2 示例代码

// 定义一个邮件服务接口
interface EmailService {void sendEmail(String message);
}// 实现邮件服务接口
class EmailServiceImpl implements EmailService {@Overridepublic void sendEmail(String message) {System.out.println("Sending email: " + message);}
}// 定义一个通知服务类,依赖 EmailService
class NotificationService {private EmailService emailService;// 使用 @Autowired 注解在 Setter 方法上进行依赖注入@Autowiredpublic void setEmailService(EmailService emailService) {this.emailService = emailService;}public void sendNotification(String message) {emailService.sendEmail(message);}
}

2.3 代码解释

在这个示例中,NotificationService 类依赖于 EmailService。通过在 setEmailService 方法上使用 @Autowired 注解,Spring 容器会自动查找 EmailService 类型的 Bean,并调用该 Setter 方法将其注入到 NotificationService 对象中。

2.4 使用优势

  • 灵活性高:可以在对象创建后动态地改变依赖项,适应不同的业务需求。
  • 部分依赖注入:当一个类有多个依赖项,但不是所有依赖项都需要在对象创建时立即注入时,使用 Setter 方法注入可以更灵活地管理依赖。

三、字段注入

3.1 基本原理

@Autowired 注解还可以直接用于类的字段上,这是一种最简单的依赖注入方式。Spring 容器会自动查找匹配类型的 Bean,并将其注入到相应的字段中。

3.2 示例代码

// 定义一个日志服务接口
interface LogService {void log(String message);
}// 实现日志服务接口
class LogServiceImpl implements LogService {@Overridepublic void log(String message) {System.out.println("Logging: " + message);}
}// 定义一个业务服务类,依赖 LogService
class BusinessService {// 使用 @Autowired 注解在字段上进行依赖注入@Autowiredprivate LogService logService;public void doBusiness() {logService.log("Business operation started.");// 业务逻辑代码logService.log("Business operation completed.");}
}

3.3 代码解释

BusinessService 类中,logService 字段使用了 @Autowired 注解。Spring 容器会自动查找 LogService 类型的 Bean,并将其注入到该字段中。这样,在 doBusiness 方法中就可以直接使用 logService 进行日志记录。

3.4 使用优势

  • 代码简洁:无需编写构造函数或 Setter 方法,代码更加简洁明了。

3.5 使用注意事项

  • 不利于单元测试:由于字段注入是通过反射实现的,在进行单元测试时,难以直接注入模拟对象,降低了代码的可测试性。
  • 依赖不明确:字段注入隐藏了类的依赖关系,不利于代码的维护和理解。

四、数组和集合注入

4.1 基本原理

@Autowired 注解不仅可以注入单个 Bean,还可以注入数组或集合类型的 Bean。Spring 容器会自动查找所有匹配类型的 Bean,并将它们注入到相应的数组或集合中。

4.2 示例代码

// 定义一个消息处理器接口
interface MessageHandler {void handleMessage(String message);
}// 实现消息处理器接口
class EmailMessageHandler implements MessageHandler {@Overridepublic void handleMessage(String message) {System.out.println("Handling email message: " + message);}
}class SmsMessageHandler implements MessageHandler {@Overridepublic void handleMessage(String message) {System.out.println("Handling SMS message: " + message);}
}// 定义一个消息分发服务类,依赖多个 MessageHandler
class MessageDispatcherService {// 使用 @Autowired 注解注入 MessageHandler 数组@Autowiredprivate MessageHandler[] messageHandlers;public void dispatchMessage(String message) {for (MessageHandler handler : messageHandlers) {handler.handleMessage(message);}}
}

3.3 代码解释

MessageDispatcherService 类中,messageHandlers 字段是一个 MessageHandler 数组,使用 @Autowired 注解进行注入。Spring 容器会自动查找所有实现了 MessageHandler 接口的 Bean,并将它们注入到该数组中。在 dispatchMessage 方法中,可以遍历数组并调用每个 MessageHandlerhandleMessage 方法。

3.4 使用优势

  • 方便管理多个同类型 Bean:当一个类需要依赖多个同类型的 Bean 时,使用数组或集合注入可以方便地管理这些 Bean。

五、总结

@Autowired 注解为 Spring 框架中的依赖注入提供了多种灵活的方式,包括构造函数注入、Setter 方法注入、字段注入以及数组和集合注入。在实际开发中,应根据具体的业务场景和需求选择合适的注入方式。构造函数注入适用于依赖项不变的场景,能提高代码的可测试性;Setter 方法注入提供了更高的灵活性,适用于依赖项可能动态变化的情况;字段注入虽然代码简洁,但不利于单元测试和代码维护;数组和集合注入则方便管理多个同类型的 Bean。通过合理使用 @Autowired 注解,可以让代码更加模块化、可维护和易于测试。

✍结尾

🀙🀚🀛🀜🀝🀞🀟🀠🀡🀐🀑🀒🀓🀔🀕🀖🀘🀗🀏🀎🀍🀌🀋🀊🀉🀈🀇🀆🀅🀃🀂🀁🀀🀄︎🀢🀣🀥🀤🀦🀧🀨🀩🀪

📘 妹妹听后点了点头,脸上露出了满意的笑容。她轻声说道:“原来如此,谢谢你,鸽鸽。看来我不仅要多读书,还要多动手实践,提升自己才行。”

看着她那充满求知欲的眼神,我不禁感叹,学习之路虽然充满挑战,但有这样一位美丽聪慧的伙伴相伴,一切都变得格外有意义。快去和妹妹一起实践一下吧!

求赞图

📘相关阅读⚡⚡

笔者 綦枫Maple 的其他作品,欢迎点击查阅哦~:
📚Jmeter性能测试大全:Jmeter性能测试大全系列教程!持续更新中!
📚UI自动化测试系列: Selenium+Java自动化测试系列教程❤
📚移动端自动化测试系列:Appium自动化测试系列教程
📚Postman系列:Postman高级使用技巧系列


👨‍🎓作者:綦枫Maple
🚀博客:CSDN、掘金等
🚀CSDN技术社区:https://bbs.csdn.net/forums/testbean
🚀网易云音乐:https://y.music.163.com/m/user?id=316706413
🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。
🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系处理。
🀐其他:若有兴趣,可以加文章结尾的Q群,一起探讨学习哦~

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

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

相关文章

IDEA + 通义灵码AI程序员:快速构建DDD后端工程模板

作者:陈荣健 IDEA 通义灵码AI程序员:快速构建DDD后端工程模板 在软件开发过程中,一个清晰、可维护、可扩展的架构至关重要。领域驱动设计 (DDD) 是一种软件开发方法,它强调将软件模型与业务领域紧密结合,从而构建更…

React 与 Vue 对比指南 - 上

React 与 Vue 对比指南 - 上 本文将展示如何在 React 和 Vue 中实现常见功能&#xff0c;从基础渲染到高级状态管理 Hello 分别使用 react 和 vue 写一个 Hello World&#xff01; react export default () > {return <div>Hello World!</div>; }vue <…

大模型开发实战篇7:语音识别-语音转文字

语音识别大模型&#xff0c;是人工智能领域的一项重要技术&#xff0c;它能够将人类的语音转换为文本。近年来&#xff0c;随着深度学习技术的不断发展&#xff0c;语音识别大模型取得了显著的进展&#xff0c;并在各个领域得到了广泛应用。 主流语音识别大模型 目前&#xf…

解锁机器学习核心算法 | K -近邻算法:机器学习的神奇钥匙

一、引言 今天我们继续学习机器学习核心算法 —— K - 近邻&#xff08;K-Nearest Neighbors&#xff0c;简称 KNN&#xff09;算法。它就像是一位经验丰富的 “老江湖”&#xff0c;以其简单而又强大的方式&#xff0c;在众多机器学习任务中占据着不可或缺的地位。 K - 近邻…

【DeepSeek】本地部署,保姆级教程

deepseek网站链接传送门&#xff1a;DeepSeek 在这里主要介绍DeepSeek的两种部署方法&#xff0c;一种是调用API&#xff0c;一种是本地部署。 一、API调用 1.进入网址Cherry Studio - 全能的AI助手选择立即下载 2.安装时位置建议放在其他盘&#xff0c;不要放c盘 3.进入软件后…

Python 入门教程(2)搭建环境 | 2.3、VSCode配置Python开发环境

文章目录 一、VSCode配置Python开发环境1、软件安装2、安装Python插件3、配置Python环境4、包管理5、调试程序 前言 Visual Studio Code&#xff08;简称VSCode&#xff09;以其强大的功能和灵活的扩展性&#xff0c;成为了许多开发者的首选。本文将详细介绍如何在VSCode中配置…

【第二节】C++设计模式(创建型模式)-抽象工厂模式

目录 引言 一、抽象工厂模式概述 二、抽象工厂模式的应用 三、抽象工厂模式的适用场景 四、抽象工厂模式的优缺点 五、总结 引言 抽象工厂设计模式是一种创建型设计模式&#xff0c;旨在解决一系列相互依赖对象的创建问题。它与工厂方法模式密切相关&#xff0c;但在应用…

ubuntu20.04重启后不显示共享文件夹

ubuntu20.04重启后不显示共享文件夹 主要参见这两篇博客 Ubuntu重启后不显示共享文件夹_ubuntu 20.04 共享目录无法使用-CSDN博客 ubuntu22.04 配置共享文件夹 找不到/mnt/hgfs_ubuntu安装tools 后mnt文件夹在哪-CSDN博客 重启Ubuntu20.04后&#xff0c;发现共享文件夹进不去…

halcon机器视觉深度学习对象检测,物体检测

目录 效果图操作步骤软件版本halcon参考代码本地函数 get_distinct_colors()本地函数 make_neighboring_colors_distinguishable() 效果图 操作步骤 首先要在Deep Learning Tool工具里面把图片打上标注文本&#xff0c; 然后训练模型&#xff0c;导出模型文件 这个是模型 mod…

2.19学习(php文件后缀)

misc buu-后门查杀 下载附件&#xff0c;我们用火绒安全扫一下然后点击详情进入该文件所在文件夹&#xff0c;再用记事本打开该文件&#xff0c;搜索flag无果&#xff0c;再试试pass&#xff08;由题目中的密码联系到pass&#xff0c;password&#xff0c;key等&#xff09;&a…

PMBOK第7版整体架构全面详解

1. 引言 7月1日对于项目管理从业者和研究者而言&#xff0c;是个非凡意义的一个时间&#xff0c;这一天&#xff0c;翘首以待的《 项 目管理知识体系指南 》&#xff08;PMBOK&#xff09;第七版终于发布了。 总体而言&#xff0c;PMBOK第七版集百家之所长&#xff0c;成一…

C++:类与对象,定义类和构造函数

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; //如何让定义一个类 // 封装 // 1、将数据和方法定义到一起。 // 2、把想给你看的数据给你看&#xff0c;不想给你看的封装起来。 通过访问限定符来实现 class Stack { public: //1.成…

nginx 部署前端vue项目

?? 主页&#xff1a; ?? 感谢各位大佬 点赞?? 收藏 留言?? 加关注! ?? 收录于专栏&#xff1a;前端工程师 文章目录 一、??什么是nginx&#xff1f;二、??nginx 部署前端vue项目步骤 2.1 ??安装nginx 2.1.1 ??windows环境安装2.1.2 ??linux环境安装 2.2 …

蓝桥杯备考策略

备赛策略 (1-2周):基础算法数据结构 (3-5周):动态规划/贪心图论 (6-8周):全真模拟查漏补缺 阶段1:基础巩固(第1-2周) **目标:**掌握基础数据结构和必考算法&#xff0c;熟悉蓝桥杯题型。 学习内容: 数据结构:数组、字符串、栈、队列、哈希表、二叉树(遍历与基本操作)。 基础…

tmux和vim的基本操作

Tmux Tmux 的核心功能 多窗口和多面板&#xff1a; 在一个终端中创建多个窗口&#xff08;Windows&#xff09;&#xff0c;每个窗口可以运行不同的任务。 在每个窗口中&#xff0c;可以进一步分割成多个面板&#xff08;Panes&#xff09;&#xff0c;实现分屏操作。 会话…

HTTP SSE 实现

参考&#xff1a; SSE协议 SSE技术详解&#xff1a;使用 HTTP 做服务端数据推送应用的技术 一句概扩 SSE可理解为&#xff1a;服务端和客户端建立连接之后双方均保持连接&#xff0c;但仅支持服务端向客户端推送数据。推送完毕之后关闭连接&#xff0c;无状态行。 下面是基于…

推荐一款AI大模型托管平台-OpenWebUI

推荐一款AI大模型托管平台-OpenWebUI 1. OpenWebUI 1. OpenWebUI什么? 官网地址&#xff1a;https://openwebui.com/ GitHub地址&#xff1a; https://github.com/open-webui/open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离…

java练习(33)

ps:题目来自力扣 最强回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 class Solution {public String longestPalindrome(String s) {if (s null || s.length() < 1) {return "";}int start 0, end 0;for (int i 0; i < s.length();…

本地部署DeepSeek大模型

环境&#xff1a;nuc工控机器 x86架构 ubuntu20.04 1、浏览器打开Download Ollama on Linux&#xff0c;复制命令。 2.打开终端&#xff0c;输入命令。 curl -fsSL https://ollama.com/install.sh | sh 等待安装&#xff0c;安装完成后&#xff0c;终端输入 ollama&#xff…

【Spring详解一】Spring整体架构和环境搭建

一、Spring整体架构和环境搭建 1.1 Spring的整体架构 Spring框架是一个分层架构&#xff0c;包含一系列功能要素&#xff0c;被分为大约20个模块 Spring核心容器&#xff1a;包含Core、Bean、Context、Expression Language模块 Core &#xff1a;其他组件的基本核心&#xff…