掌握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…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...