掌握Spring开发_常用注解详解
1. 前言
1.1 写作目的
本文旨在全面解析Spring框架中常用的注解,帮助开发者更好地理解和使用这些注解,提高开发效率和代码质量。Spring框架提供了丰富的注解,简化了依赖注入、AOP、事务管理、Web开发等多个方面的开发工作。通过本文的学习,读者可以掌握这些注解的使用方法和最佳实践。
2. Spring基础回顾
2.1 Spring框架简介
Spring是一个轻量级的Java开发框架,提供了依赖注入(DI)、面向切面编程(AOP)、事务管理、Web开发、消息处理、缓存管理、安全控制等功能,简化了企业级应用的开发。Spring的核心理念是“控制反转”(Inversion of Control, IoC)和“面向切面编程”(Aspect-Oriented Programming, AOP),通过这些机制,Spring可以更好地管理对象的生命周期和依赖关系,提高代码的可维护性和可扩展性。
2.2 核心概念与组件
- IoC容器:Spring的核心组件之一,负责管理Bean的生命周期和依赖关系。IoC容器通过依赖注入(DI)机制,将对象的创建和依赖关系的管理交给容器来完成,从而降低对象之间的耦合度。
- BeanFactory 和 ApplicationContext:两种不同的IoC容器实现。BeanFactory是最基本的IoC容器,提供了基本的依赖注入功能;ApplicationContext是BeanFactory的扩展,提供了更多的企业级功能,如国际化支持、事件传播、AOP等。
- AOP:通过横切关注点分离业务逻辑,增强代码复用性和可维护性。AOP允许开发者将横切关注点(如日志记录、事务管理、安全性检查等)从业务逻辑中分离出来,以模块化的方式进行管理和复用。
3. 核心注解解析
3.1 @Component 及其变体
3.1.1 @Component
@Component是Spring中最基本的注解,用于标记一个类为Spring组件,使其被自动扫描并注册到Spring容器中。通过使用@Component注解,Spring会自动管理该类的实例,并在需要时注入到其他Bean中。
示例代码:
@Component
public class MyComponent {public void doSomething() {System.out.println("Doing something in MyComponent");}
}
3.1.2 @Service
@Service是@Component的特化版本,专门用于标记服务层组件,通常用于业务逻辑层。使用@Service注解可以更清晰地表达该类的用途,便于代码的维护和理解。
示例代码:
@Service
public class MyService {public void performService() {System.out.println("Performing service in MyService");}
}
3.1.3 @Repository
@Repository是@Component的特化版本,用于标记数据访问层组件,通常用于DAO层。使用@Repository注解可以更清晰地表达该类的用途,并且可以自动处理数据访问层的异常。
示例代码:
@Repository
public class MyRepository {public void saveData() {System.out.println("Saving data in MyRepository");}
}
3.1.4 @Controller
@Controller是@Component的特化版本,用于标记控制器层组件,通常用于Web层。使用@Controller注解可以更清晰地表达该类的用途,并且可以处理HTTP请求和响应。
示例代码:
@Controller
public class MyController {@GetMapping("/hello")public String sayHello() {return "Hello, World!";}
}
3.2 @Autowired 和 @Inject
@Autowired和@Inject都是用于自动注入依赖对象的注解。@Autowired是Spring特有的注解,而@Inject是JSR-330标准的一部分。这两个注解可以用于构造器、Setter方法或字段上,用于注入依赖对象。
示例代码:
@Service
public class MyService {@Autowiredprivate MyRepository myRepository;public void performService() {myRepository.saveData();System.out.println("Performing service in MyService");}
}
3.3 @Value
@Value用于注入配置文件中的属性值或直接注入字符串、表达式等。通过使用@Value注解,可以将配置信息与代码分离,便于管理和修改。
示例代码:
@Component
public class MyComponent {@Value("${app.name}")private String appName;public void printAppName() {System.out.println("App Name: " + appName);}
}
application.properties:
app.name=MySpringApp
3.4 @Configuration 和 @Bean
@Configuration用于定义配置类,@Bean用于在配置类中定义Bean。通过使用@Configuration注解,可以将配置信息集中在一个类中,便于管理和维护。
示例代码:
@Configuration
public class AppConfig {@Beanpublic MyComponent myComponent() {return new MyComponent();}
}
3.5 @Scope
@Scope用于指定Bean的作用域,如单例(singleton)、原型(prototype)等。通过使用@Scope注解,可以控制Bean的生命周期和实例化方式。
示例代码:
@Component
@Scope("prototype")
public class MyPrototypeComponent {public void doSomething() {System.out.println("Doing something in MyPrototypeComponent");}
}
4. 依赖注入与控制反转
4.1 构造器注入
构造器注入通过构造方法注入依赖,确保依赖不可变且必须存在。构造器注入的优点是依赖关系明确,便于单元测试。
示例代码:
@Service
public class MyService {private final MyRepository myRepository;@Autowiredpublic MyService(MyRepository myRepository) {this.myRepository = myRepository;}public void performService() {myRepository.saveData();System.out.println("Performing service in MyService");}
}
4.2 Setter注入
Setter注入通过Setter方法注入依赖,适用于依赖可选或可变的情况。Setter注入的优点是灵活性高,便于在运行时修改依赖关系。
示例代码:
@Service
public class MyService {private MyRepository myRepository;@Autowiredpublic void setMyRepository(MyRepository myRepository) {this.myRepository = myRepository;}public void performService() {myRepository.saveData();System.out.println("Performing service in MyService");}
}
4.3 字段注入
字段注入直接在字段上使用@Autowired注入依赖,简单但不推荐,因为不利于单元测试。字
相关文章:
掌握Spring开发_常用注解详解
1. 前言 1.1 写作目的 本文旨在全面解析Spring框架中常用的注解,帮助开发者更好地理解和使用这些注解,提高开发效率和代码质量。Spring框架提供了丰富的注解,简化了依赖注入、AOP、事务管理、Web开发等多个方面的开发工作。通过本文的学习,读者可以掌握这些注解的使用方法…...
华为昇腾服务器(固件版本查询、驱动版本查询、CANN版本查询)
文章目录 1. **查看固件和驱动版本**2. **查看CANN版本**3. **其他辅助方法**注意事项 在华为昇腾服务器上查看固件、驱动和CANN版本的常用方法如下: 1. 查看固件和驱动版本 通过命令行工具 npu-smi 执行以下命令查看当前设备的固件(Firmware࿰…...
Kubernetes的Ingress和Service有什么区别?
在Kubernetes中,Ingress和Service是两个不同的概念,它们在功能、作用范围、应用场景等方面存在明显区别,具体如下: 功能 Ingress:主要用于管理集群外部到内部服务的HTTP和HTTPS流量路由。它可以根据域名、路径等规则…...
洛谷B3619(B3620)
B3619 10 进制转 x 进制 - 洛谷 B3620 x 进制转 10 进制 - 洛谷 代码区: #include<algorithm> #include<iostream> #include<vector> using namespace std;int main(){int n,x;cin >> n >> x;vector<char> arry;while(n){if(…...
vue组件,父子通信,路由,异步请求后台接口,跨域
1.组件注册 1.1局部注册 局部注册组件---1.导入import 组件对象名 from 组件网页路径 export default{ name:"名称", data(){return {}}, created(){}, …...
详解分布式ID实践
引言 分布式ID,所谓的分布式ID,就是针对整个系统而言,任何时刻获取一个ID,无论系统处于何种情况,该值不会与之前产生的值重复,之后获取分布式ID时,也不会再获取到与其相同的值,它是…...
.NET + Vue3 的前后端项目在IIS的发布
目录 一、发布准备 1、安装 IIS 2、安装 Windows Hosting Bundle(.NET Core 托管捆绑包) 3、安装 IIS URL Rewrite 二、项目发布 1、后端项目发布 2、前端项目发布 3、将项目部署到 IIS中 三、网站配置 1、IP配置 2、防火墙配置 3、跨域配置…...
软件测试之压力测试
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 压力测试 压力测试是一种软件测试,用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&…...
矩阵-矩阵置零
矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为0 。请使用 原地 算法。在计算机科学中,一个原地算法(in-place algorithm)是一种使用小的,固定数量的额外之空间来转…...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter19-表单脚本
十九、表单脚本 表单脚本 JavaScript 较早的一个用途是承担一部分服务器端表单处理的责任。虽然 Web 和 JavaScript 都已经发展了很多年,但 Web 表单的变化不是很大。由于不能直接使用表单解决问题,因此开发者不得不使用JavaScript 既做表单验证…...
【C# 数据结构】队列 FIFO
目录 队列的概念FIFO (First-In, First-Out)Queue<T> 的工作原理:示例:解释: 小结: 环形队列1. **FIFO?**2. **环形缓冲队列如何实现FIFO?**关键概念: 3. **环形缓冲队列的工作过程**假设…...
论文笔记-WWWCompanion2024-LLM as Data Augmenters for Cold-Start Item Recommendation
论文笔记-WWW Companion 2024-Large Language Models as Data Augmenters for Cold-Start Item Recommendation 大语言模型作为冷启动项目推荐的数据增强器摘要1.引言2.前言3.LLMs作为数据增强3.1增强数据生成3.2成对比较损失 4.实验4.1实验设置4.2结果和分析4.3超参数实验 5.总…...
Java 语法新特性(Records、Pattern Matching、Sealed Classes)深度解析(11/17/21)✨
一、Records(Java 16) 📝 核心价值:简化不可变数据载体的定义 // 传统POJO vs Record public record User(String name, int age) {} // 自动生成:构造方法/equals()/hashCode()/toString() User user new User(&qu…...
QUdpSocket的readyRead信号只触发一次
问题 QUdpSocket的readyRead信号只触发一次。 原因 on_readyRead槽函数里必须读出现有数据后,才能触发新的事件。 解决办法 在on_readyRead槽函数里取出数据。 void MainWindow::on_readyRead() {qDebug() << "on_readyRead in";while (m_udp…...
jsherp importItemExcel接口存在SQL注入
一、漏洞简介 很多人说管伊佳ERP(原名:华夏ERP,英文名:jshERP)是目前人气领先的国产ERP系统虽然目前只有进销存财务生产的功能,但后面将会推出ERP的全部功能,有兴趣请帮点一下 二、漏洞影响 …...
测试data_management函数
测试data_management函数 这是我最近正在开发的AI工具信息平台的部门功能模块测试,基于streamlit架构。整理出来与大家分享,也为我以后自己回溯找到资源。 为了测试 data_management 函数并结合 Excel 文件中的 “Tools” 表单内容,我们需要…...
微信小程序---计划时钟设计与实现
微信小程序-计划时钟已上线,欢迎各位小伙伴的测试和使用~(微信小程序搜计划时钟即可使用) 在这篇博客中,我们将探讨如何在微信小程序中设计和实现一个任务管理功能,该功能允许用户添加、删除和查看任务。任务管理系统的核心是基于日期和时间的任务管理,可以设置任务的开…...
深度学习之图像回归(二)
前言 这篇文章主要是在图像回归(一)的基础上对该项目进行的优化。(一)主要是帮助迅速入门 理清一个深度学习项目的逻辑 这篇文章则主要注重在此基础上对于数据预处理和模型训练进行优化前者会通过涉及PCA主成分分析 特征选择 后…...
深入理解HttpSecurity的设计
一、HttpSecurity的应用 在前章节的介绍中我们讲解了基于配置文件的使用方式,也就是如下的使用。 也就是在配置文件中通过 security:http 等标签来定义了认证需要的相关信息,但是在SpringBoot项目中,我们慢慢脱离了xml配置文件的方式,在SpringSecurity中提供了HttpSecurity…...
15增减字符串匹配(贪心)思路解析+源码
文章目录 题目[](https://leetcode.cn/problems/di-string-match/)算法原理贪心证明源码总结题目 假设s="I D I D"也就是增降增降,在0-4中,每两个数存在这种方式数组为【1, 3,2, 4,0】;(如下图) 算法原理 解法:贪心 1.当遇到“I”:选择当前最小的那个数 2…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
MeshGPT 笔记
[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭!_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...
【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...
CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
联邦学习带宽资源分配
带宽资源分配是指在网络中如何合理分配有限的带宽资源,以满足各个通信任务和用户的需求,尤其是在多用户共享带宽的情况下,如何确保各个设备或用户的通信需求得到高效且公平的满足。带宽是网络中的一个重要资源,通常指的是单位时间…...
