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

Spring Boot常用注解深度解析:从入门到精通

        今天,这篇文章带你将深入理解Spring Boot中30+常用注解,通过代码示例和关系图,帮助你彻底掌握Spring核心注解的使用场景和内在联系。

一、启动类与核心注解

1.1 @SpringBootApplication

组合注解

@SpringBootApplication @Configuration + @EnableAutoConfiguration +@ComponentScan

@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

三个核心功能:

  • @Configuration:声明配置类

  • @EnableAutoConfiguration:启用自动配置

  • @ComponentScan:组件扫描(默认扫描启动类所在包及其子包)

二、配置与Bean管理

2.1 @Configuration

声明配置类,内部包含多个@Bean方法

@Configuration
public class AppConfig {@Beanpublic DataSource dataSource() {return new HikariDataSource();}
}

2.2 @Bean vs @Component

特性@Bean@Component
声明位置配置类方法类级别
控制粒度第三方库类自己编写的类
依赖注入方法参数自动注入字段/构造器

2.3 @Scope Bean作用域

@Bean
@Scope("prototype")
public Service prototypeService() {return new Service();
}

三、依赖注入(DI)

3.1 @Autowired

自动注入的三种方式:

// 构造器注入(推荐)
@Autowired
public MyController(MyService service) {this.service = service;
}// Setter注入
@Autowired
public void setService(MyService service) {this.service = service;
}// 字段注入(不推荐)
@Autowired
private MyService service;

3.2 @Qualifier

解决多个同类型Bean的冲突

@Autowired
@Qualifier("mainService")
private Service service;

3.3 @Primary

设置首选Bean

@Bean
@Primary
public Service primaryService() {return new PrimaryService();
}

四、组件扫描与分层架构

4.1 分层注解

@Service
public class UserService {// 业务逻辑
}@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;
}

 五、Web开发注解

5.1 请求映射

@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {return userService.findById(id);
}@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public User createUser(@RequestBody User user) {return userService.save(user);
}

5.2 参数绑定

@GetMapping
public List<User> searchUsers(@RequestParam(defaultValue = "1") int page,@RequestParam(required = false) String name) {// 分页查询逻辑
}

六、条件装配注解

6.1 @ConditionalOnProperty

@Bean
@ConditionalOnProperty(prefix = "feature",name = "new-payment",havingValue = "true")
public PaymentService newPaymentService() {return new NewPaymentService();
}

6.2 其他条件注解

  • @ConditionalOnClass:类路径存在指定类时生效

  • @ConditionalOnMissingBean:容器中不存在指定Bean时生效

七、AOP编程

7.1 切面配置

@Aspect
@Component
public class LoggingAspect {@Pointcut("execution(* com.example.service.*.*(..))")private void serviceLayer() {}@Around("serviceLayer()")public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable {// 记录方法执行时间long start = System.currentTimeMillis();Object result = joinPoint.proceed();long duration = System.currentTimeMillis() - start;System.out.println(joinPoint.getSignature() + " executed in " + duration + "ms");return result;}
}

 八、配置属性绑定

8.1 @ConfigurationProperties

@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {private String name;private int version;private List<String> servers = new ArrayList<>();// getters/setters
}

application.yml配置:

app:name: MyApplicationversion: 2servers:- server1- server2

 九、Bean 的生命周期

        Spring Boot 中的 Bean 生命周期是理解 Spring 容器管理 Bean 的关键。Bean 的生命周期大致可以分为以下几个阶段:

  1. 实例化(Instantiation):Spring 容器通过调用无参构造方法创建 Bean 实例。

  2. 属性赋值(Population):Spring 容器通过反射将配置文件或注解中定义的属性值注入到 Bean 中。

  3. 初始化前处理(Pre-initialization)

    • BeanNameAware:如果 Bean 实现了 BeanNameAware 接口,Spring 会调用其 setBeanName 方法,将 Bean 的名称传递给 Bean。

    • BeanFactoryAware:如果 Bean 实现了 BeanFactoryAware 接口,Spring 会调用其 setBeanFactory 方法,将 BeanFactory 传递给 Bean。

    • BeanPostProcessor:Spring 会调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法,对 Bean 进行前置处理。

  4. 初始化(Initialization)

    • InitializingBean:如果 Bean 实现了 InitializingBean 接口,Spring 会调用其 afterPropertiesSet 方法进行初始化。

    • @PostConstruct:如果 Bean 中有方法使用了 @PostConstruct 注解,Spring 会调用该方法进行初始化。

  5. 使用(Usage):Bean 已经初始化完成,可以被应用程序使用。

  6. 销毁前处理(Pre-destruction)

    • DisposableBean:如果 Bean 实现了 DisposableBean 接口,Spring 会调用其 destroy 方法进行销毁前的清理工作。

    • @PreDestroy:如果 Bean 中有方法使用了 @PreDestroy 注解,Spring 会调用该方法进行销毁前的清理工作。

  7. 销毁(Destruction):Spring 容器关闭时,销毁 Bean。

@Component
public class MyBean implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {private String name;public MyBean() {System.out.println("1. 实例化 Bean");}@Overridepublic void setBeanName(String name) {System.out.println("2. 设置 Bean 名称");}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("3. 设置 BeanFactory");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("4. 初始化 Bean");}@Overridepublic void destroy() throws Exception {System.out.println("6. 销毁 Bean");}@PostConstructpublic void init() {System.out.println("5. @PostConstruct 注解的初始化方法");}@PreDestroypublic void preDestroy() {System.out.println("7. @PreDestroy 注解的销毁前方法");}
}

 十、注解关系图谱

 总结

        Spring Boot 中的注解和 Bean 生命周期是开发中非常重要的概念。通过合理使用各种注解,可以大大简化开发过程,提高开发效率。同时,理解 Bean 的生命周期有助于更好地管理 Bean 的创建、初始化和销毁过程,确保应用程序的稳定性和可靠性。

相关文章:

Spring Boot常用注解深度解析:从入门到精通

今天&#xff0c;这篇文章带你将深入理解Spring Boot中30常用注解&#xff0c;通过代码示例和关系图&#xff0c;帮助你彻底掌握Spring核心注解的使用场景和内在联系。 一、启动类与核心注解 1.1 SpringBootApplication 组合注解&#xff1a; SpringBootApplication Confi…...

can not add outlook new accounts on the outlook

link : Reference url...

私有化部署 DeepSeek + Dify,构建你的专属私人 AI 助手

私有化部署 DeepSeek Dify&#xff0c;构建你的专属私人 AI 助手 概述 DeepSeek 是一款开创性的开源大语言模型&#xff0c;凭借其先进的算法架构和反思链能力&#xff0c;为 AI 对话交互带来了革新性的体验。通过私有化部署&#xff0c;你可以充分掌控数据安全和使用安全。…...

【Elasticsearch】post_filter

post_filter是 Elasticsearch 中的一种后置过滤机制&#xff0c;用于在查询执行完成后对结果进行过滤。以下是关于post_filter的详细介绍&#xff1a; 工作原理 • 查询后过滤&#xff1a;post_filter在查询执行完毕后对返回的文档集进行过滤。这意味着所有与查询匹配的文档都…...

验证工具:GVIM和VIM

一、定义与关系 gVim&#xff1a;gVim是Vim的图形界面版本&#xff0c;提供了更多的图形化功能&#xff0c;如菜单栏、工具栏和鼠标支持。它使得Vim的使用更加直观和方便&#xff0c;尤其对于不习惯命令行界面的用户来说。Vim&#xff1a;Vim是一个在命令行界面下运行的文本编…...

如何优化垃圾回收机制?

垃圾回收机制 掌握 GC 算法之前&#xff0c;我们需要先弄清楚 3 个问题。第一&#xff0c;回收发生在哪里&#xff1f;第二&#xff0c;对象在 什么时候可以被回收&#xff1f;第三&#xff0c;如何回收这些对象&#xff1f; 回收发生在哪里&#xff1f; JVM 的内存区域中&…...

beyond the ‘PHYSICAL‘ memory limit.问题处理

Container [pid5616,containerIDcontainer_e50_1734408743176_3027740_01_000006] is running 507887616B beyond the ‘PHYSICAL’ memory limit. Current usage: 4.5 GB of 4 GB physical memory used; 6.6 GB of 8.4 GB virtual memory used. Killing container. 1.增大map…...

Day36【AI思考】-表达式知识体系总览

文章目录 **表达式知识体系总览**回答1&#xff1a;**表达式知识体系****一、三种表达式形式对比****二、表达式转换核心方法****1. 中缀转后缀&#xff08;重点&#xff09;****2. 中缀转前缀** **三、表达式计算方法****1. 后缀表达式计算&#xff08;栈实现&#xff09;****…...

段错误(Segmentation Fault)调试

1. 使用 GDB&#xff08;GNU Debugger&#xff09; GDB 是一个强大的调试工具&#xff0c;可以帮助你逐步执行程序并检查变量状态。 编译时添加调试信息&#xff1a; gcc -g your_program.c -o your_program启动 GDB&#xff1a; gdb ./your_program运行程序&#xff1a; …...

每日Attention学习19——Convolutional Multi-Focal Attention

每日Attention学习19——Convolutional Multi-Focal Attention 模块出处 [ICLR 25 Submission] [link] UltraLightUNet: Rethinking U-shaped Network with Multi-kernel Lightweight Convolutions for Medical Image Segmentation 模块名称 Convolutional Multi-Focal Atte…...

LeetCode题练习与总结:三个数的最大乘积--628

一、题目描述 给你一个整型数组 nums &#xff0c;在数组中找出由三个数组成的最大乘积&#xff0c;并输出这个乘积。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;6示例 2&#xff1a; 输入&#xff1a;nums [1,2,3,4] 输出&#xff1a;24示例 3&a…...

Colorful/七彩虹 隐星P15 TA 24 原厂Win11 家庭版系统 带F9 Colorful一键恢复功能

Colorful/七彩虹 隐星P15 TA 24 原厂Win11 家庭中文版系统 带F9 Colorful一键恢复功能 自动重建COLORFUL RECOVERY功能 带所有随机软件和机型专用驱动 支持机型&#xff1a;隐星P15 TA 24 文件下载&#xff1a;asusoem.cn/745.html 文件格式&#xff1a;ISO 系统版本&…...

第二篇:多模态技术突破——DeepSeek如何重构AI的感知与认知边界

——从跨模态对齐到因果推理的工程化实践 在AI技术从单一模态向多模态跃迁的关键阶段&#xff0c;DeepSeek通过自研的多模态融合框架&#xff0c;在视觉-语言-语音的联合理解与生成领域实现系统性突破。本文将从技术实现层面&#xff0c;解构其跨模态表征学习、动态融合机制与…...

CTreeCtrl 设置图标

mfc界面修改真难受 使用CTreeCtrl 进行设置导航视图时&#xff0c;有时候需要设置图标&#xff0c;一般使用如下代码 m_TreeViewImages.DeleteImageList();UINT uiBmpId IDB_ICONLIST_TREE;CBitmap bmp; if (!bmp.LoadBitmap(uiBmpId)) return;BITMAP bmpObj; bmp.GetBitmap…...

在JAX-RS中获取请求头信息的方法

在JAX-RS中获取请求头信息的方法 HeaderParam注解&#xff0c;可以直接将请求头中的特定值注入到方法参数中&#xff0c;代码示例&#xff1a; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.Path; import javax.ws.rs.core.Response;Path(&q…...

Java 面试之结束问答

技术优化 线程池优化 设置最大线程数设置最小核心线程数设置额外线程存活时间选择线程池队列选择合适的线程池选择合适的饱和策略 锁优化 尽量不要锁住方法缩小同步代码块&#xff0c;只锁数据锁中尽量不要再包含锁将锁私有化&#xff0c;在内部管理锁进行适当的锁分解 HT…...

柔性数组与c/c++程序中内存区域的划分

1.柔性数组 1.1柔性数组的定义 柔性数组是指在结构体中定义的&#xff0c;其大小在编译时未确定&#xff0c;而在运行时动态分配的数组。这种数组允许结构体的大小根据需要动态变化。语法如下&#xff1a; struct D {int a;int arry1[0]; };struct F {int a;int arry2[]; };…...

mini-lsm通关笔记Week2Day7

项目地址&#xff1a;https://github.com/skyzh/mini-lsm 个人实现地址&#xff1a;https://gitee.com/cnyuyang/mini-lsm 在上一章中&#xff0c;您已经构建了一个完整的基于LSM的存储引擎。在本周末&#xff0c;我们将实现存储引擎的一些简单但重要的优化。欢迎来到Mini-LSM的…...

Typora免费使用

一.下载地址 https://typoraio.cn/ 二.修改配置文件 1.找到安装路径下的LicenseIndex.180dd4c7.4da8909c.chunk.js文件 文件路径为:安装路径\resources\page-dist\static\js\LicenseIndex.180dd4c7.4da8909c.chunk.js 将js中的 e.hasActivated"true"e.hasActiva…...

AI驱动的无线定位:基础、标准、最新进展与挑战

1. 论文概述 研究目标:本论文旨在综述AI在无线定位领域的应用,包括其基础理论、标准化进展、最新技术发展,以及面临的挑战和未来研究方向。主要发现: AI/ML 技术已成为提升无线定位精度和鲁棒性的关键手段,特别是在 3GPP 标准的推动下。论文系统性地分析了 AI 在 LOS/NLOS…...

终极CoreCycler完全指南:5步掌握CPU单核稳定性测试与精准调校

终极CoreCycler完全指南&#xff1a;5步掌握CPU单核稳定性测试与精准调校 【免费下载链接】corecycler Script to test single core stability, e.g. for PBO & Curve Optimizer on AMD Ryzen or overclocking/undervolting on Intel processors 项目地址: https://gitco…...

完整实战指南:使用N_m3u8DL-RE高效解决流媒体下载难题

完整实战指南&#xff1a;使用N_m3u8DL-RE高效解决流媒体下载难题 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE …...

轻量级爬虫框架slacrawl:基于规则驱动的模块化数据采集实践

1. 项目概述&#xff1a;一个轻量级、模块化的网页爬虫框架最近在做一个需要从多个网站定时抓取结构化数据的小项目&#xff0c;找了一圈现成的工具&#xff0c;要么太重&#xff08;像Scrapy&#xff0c;学起来成本高&#xff09;&#xff0c;要么太死板&#xff08;很多脚本只…...

期权交易基础框架:模块化设计与Python实现指南

1. 项目概述&#xff1a;一个为期权交易者打造的“乐高积木”底座如果你在量化交易或者期权策略开发领域摸爬滚打过一段时间&#xff0c;大概率会遇到一个共同的痛点&#xff1a;策略想法很多&#xff0c;但把它们变成可回测、可实盘、可管理的代码&#xff0c;却要耗费大量的“…...

Kubernetes部署Valheim游戏服务器:云原生技术赋能游戏运维实践

1. 项目概述&#xff1a;当维京英灵殿遇上容器编排如果你和我一样&#xff0c;既沉迷于《英灵神殿》&#xff08;Valheim&#xff09;里与好友共建家园、挑战上古巨兽的乐趣&#xff0c;又恰好是一名整天和Kubernetes&#xff08;k8s&#xff09;打交道的开发者或运维&#xff…...

faah:轻量级自动化任务编排器,简化运维与数据处理工作流

1. 项目概述&#xff1a;一个被低估的自动化利器最近在整理自己的自动化工具链时&#xff0c;又翻出了kiron0/faah这个项目。说实话&#xff0c;第一次看到这个仓库名&#xff0c;我也有点懵——“faah”&#xff1f;这名字听起来不像是一个典型的工具。但点进去之后&#xff0…...

PowerInfer:基于稀疏激活的LLM推理引擎,消费级GPU运行百亿大模型

1. 项目概述&#xff1a;当大模型推理遇见“热点激活”最近在折腾本地大模型部署的朋友&#xff0c;可能都绕不开一个核心痛点&#xff1a;显存。动辄几十GB的模型&#xff0c;配上动辄几十GB的推理显存需求&#xff0c;让消费级显卡&#xff08;比如我们常见的24GB显存的RTX 4…...

5分钟学会创建专业交通网络可视化地图

5分钟学会创建专业交通网络可视化地图 【免费下载链接】transit-map The server and client used in transit map simulations like swisstrains.ch 项目地址: https://gitcode.com/gh_mirrors/tr/transit-map 你想在网页上展示动态的公共交通网络吗&#xff1f;Transit…...

智能跨平台文件同步革命:OpenMTP让Mac与Android无缝连接

智能跨平台文件同步革命&#xff1a;OpenMTP让Mac与Android无缝连接 【免费下载链接】openmtp OpenMTP - Advanced Android File Transfer Application for macOS 项目地址: https://gitcode.com/gh_mirrors/op/openmtp 你是否曾经为Mac和Android设备之间的文件传输而烦…...

(最新版)GitGitHub实操图文详解教程(01)—Git的起源

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 在现代软件开发过程中&#xff0c;版本控制工具已经成为代码管理与团队协作的重要基础设施。随着软件项目规模不断扩大以及多人协作需求日益复杂&#xff0c;开发团队不仅需…...