深入解析:Spring Boot注解

news/2025/9/22 13:19:24/文章来源:https://www.cnblogs.com/tlnshuju/p/19104986

深入解析:Spring Boot注解

2025-09-22 13:14  tlnshuju  阅读(0)  评论(0)    收藏  举报

Spring Boot 之所以能成为 Java 开发者的 “心头好”,很大程度上归功于它化繁为简的注解体系—— 原本需要大量 XML 配置的工作,如今只需几个注解就能轻松搞定。

一、启动类与核心配置:项目的 “启动引擎”

Spring Boot 项目的入口是启动类,而核心注解定义了项目的整体配置规则。

1. @SpringBootApplication:最核心的启动注解

        这是 Spring Boot 项目的 “标志性注解”,它是 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 三个注解的组合,作用是:

  • 标记当前类为配置类(等价于@Configuration);
  • 开启自动配置(Spring Boot 根据依赖自动配置 Bean);
  • 扫描当前包及子包下的组件(如 @Component、@Service 等标注的类)。

示例:最简启动类

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

一行注解,就完成了 “配置 + 自动配置 + 组件扫描” 三大核心工作~

2. @EnableAutoConfiguration:自动配置的 “开关”

        单独使用时,它会根据项目依赖自动配置对应的 Bean(比如引入 spring-boot-starter-web
,就会自动配置 Web 相关的 Tomcat、Spring MVC 等 Bean)。通常无需单独写,因为 @SpringBootApplication 已经包含了它。

3. @ComponentScan:组件扫描的 “范围定义”

指定 Spring 扫描组件(@Component、@Service、@Controller 等)的包路径。若不指定,默认扫描当前类所在包及子包

示例(指定扫描多个包):

@ComponentScan(basePackages = {"com.example.service", "com.example.controller"})
@SpringBootApplication
public class MyApplication {
// ...
}

4. @Configuration:自定义配置类的 “标识”

标记一个类为配置类,作用类似于传统 Spring 中的 XML 配置文件。在配置类中,可通过@Bean 注解定义 Bean。

示例:自定义 RedisTemplate Bean

@Configuration
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
RedisTemplate template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 配置序列化规则...
return template;
}
}

二、Web 开发:前后端交互的 “桥梁”

Spring Boot 对 Web 开发的支持非常友好,注解让接口开发变得极其简洁。

1.@RestController: 接口开发的 “万能注解”

它是 @Controller + @ResponseBody 的组合,作用是:

  • 标记类为控制器(处理 HTTP 请求);
  • 让所有方法的返回值直接作为 HTTP 响应体(如 JSON、字符串),无需再单独加 @ResponseBody。

示例:返回 JSON 数据的接口

@RestController
@RequestMapping("/api/user")
public class UserController {
@GetMapping("/list")
public List listUsers() {
return userService.findAll(); // 自动转 JSON 返回
}
}

2. @RequestMapping:请求映射

  • @RequestMapping:标注请求的URL 路径、请求方法(GET/POST 等);
  • @GetMapping / @PostMapping:是 @RequestMapping 的快捷方式(分别对应 GET、POST 请求)。

示例:处理 POST 请求的接口

@PostMapping("/save")
public Result saveUser(@RequestBody User user) {
userService.save(user);
return Result.success("保存成功");
}

3. @RequestParam / @PathVariable / @RequestBody:参数绑定

这三个注解用于接收前端传递的参数,对应 “URL 参数”“路径参数”“请求体(JSON/XML)” 三种场景,在 Spring Boot 中用法与 Spring MVC 完全一致。

三、依赖注入与组件管理:项目的 “零件组装”

Spring 的核心思想是 “依赖注入(DI)”,这些注解让 “零件(Bean)” 的组装变得灵活。

1. @Autowired / @Resource:依赖注入

两者都用于从 Spring 容器中获取 Bean 并注入到字段 / 方法中,简化对象创建与依赖管理。

  • @Autowired:Spring 提供的注解,默认按类型注入;
  • @Resource:JDK 提供的注解,默认按名称注入(可通过 name 属性指定 Bean 名称)。

示例:注入 UserService

@Service
public class UserServiceImpl implements UserService {
// 业务逻辑...
}
@RestController
public class UserController {
@Autowired
private UserService userService; // 自动注入 UserService Bean
}

2. @Component / @Service / @Repository / @Controller:组件标识

这些注解用于标记类为 Spring 管理的 “组件(Bean)”,让 Spring 自动扫描并纳入容器管理:

  • @Component:通用组件标识;
  • @Service:标记业务层组件;
  • @Repository:标记 ** 数据访问层(DAO)** 组件,还能触发持久层异常转换;
  • @Controller:标记控制层组件(处理 HTTP 请求)。

示例:各层组件标记

@Repository
public class UserDaoImpl implements UserDao { /* DAO 逻辑 */ }
@Service
public class UserServiceImpl implements UserService { /* 业务逻辑 */ }
@Controller
public class UserController { /* 控制层逻辑 */ }

四、配置加载与属性绑定:灵活的 “配置中心”

        Spring Boot 支持从 application.yml/application.properties 等文件加载配置,这些注解让 “配置到Java 对象” 的绑定更便捷。

1. @ConfigurationProperties:批量绑定配置属性

将配置文件中的一组属性批量绑定到 Java 类的字段上,适合需要绑定多个配置的场景(如数据库连接、第三方服务配置)。

示例:绑定数据库配置
配置文件(application.yml):

spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 123456

Java 类:

@ConfigurationProperties(prefix = "spring.datasource")
@Component
@Data // Lombok 注解,生成 getter/setter
public class DataSourceProps {
private String url;
private String username;
private String password;
}

这样,url、username、password就会自动从配置文件中读取。

2. @Value:单个属性的 “精准绑定”

用于绑定单个配置属性,支持 “SpEL 表达式” 和 “默认值”。

示例:绑定服务器端口

@Component
public class ServerInfo {
@Value("${server.port:8080}") // 从配置取 server.port,默认 8080
private Integer port;
}

3. @PropertySource:加载自定义配置文件

        指定要加载的自定义配置文件(如 config/user.properties),配合@Value 或 @ConfigurationProperties 使用。

@PropertySource("classpath:config/user.properties")
@Configuration
public class UserConfig {
@Value("${user.max-count}")
private Integer maxCount;
}

五、数据访问与持久化:和数据库 “打交道”

Spring Boot 整合 JPA、MyBatis 等框架时,这些注解让数据库操作更简洁。

1. JPA 相关注解(以 Hibernate 为例)

  • @Entity:标记类为数据库实体类(对应一张表);
  • @Table(name = "xxx"):指定实体类对应的数据表名;
  • @Id:标记主键字段;
  • @GeneratedValue:指定主键生成策略(如自增);
  • @Column(name = "xxx"):指定字段对应的数据表列名。

示例:用户实体类

@Entity
@Table(name = "t_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主键
private Long id;
@Column(name = "user_name")
private String username;
private Integer age;
// getter/setter...
}

2. @Transactional:声明式事务

标记方法或类,让方法执行时自动纳入事务管理(异常时回滚,正常时提交)。

示例:添加事务的业务方法

@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional
public void saveUserWithTx(User user) {
userDao.save(user);
// 若后续逻辑抛异常,save 操作会回滚
}
}

六、AOP 与切面编程:无侵入式 “增强”

AOP(面向切面编程)能在不修改原有代码的情况下,对方法进行 “增强”(如日志、权限校验、事务)。

1. @Aspect:标记切面类

标记一个类为切面类,在其中定义 “切点” 和 “通知”。

2. @Pointcut:定义切点

指定哪些方法需要被 “切面” 增强(通过表达式匹配方法)。

3. @Before / @After / @Around:通知类型

  • @Before:目标方法执行前执行增强逻辑;
  • @After:目标方法执行后(无论是否异常)执行增强逻辑;
  • @Around:目标方法执行前后都能执行增强逻辑(最灵活)。

示例:记录方法执行时间的切面

@Aspect
@Component
public class TimeLogAspect {
@Pointcut("execution(* com.example.service.*.*(..))") // 匹配 service 包下所有方法
public void serviceMethods() {}
@Around("serviceMethods()")
public Object logTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
try {
return joinPoint.proceed(); // 执行目标方法
} finally {
long cost = System.currentTimeMillis() - start;
System.out.println(joinPoint.getSignature() + " 执行耗时:" + cost + "ms");
}
}
}

七、异步与定时任务:非阻塞与自动化

1. @Async:异步执行方法

让方法异步执行(放入线程池,不阻塞主线程),需配合 @EnableAsync(在启动类上标注)使用。

示例:异步发送邮件

@Service
public class MailService {
@Async
public void sendMail(String to, String content) {
// 发送邮件逻辑(异步执行,主线程不等待)
}
}

2. @Scheduled:定时任务

让方法按指定规则定时执行,需配合 @EnableScheduling(在启动类上标注)使用。

示例:每天凌晨 1 点清理缓存

@Component
public class CacheCleaner {
@Scheduled(cron = "0 0 1 * * ?") // cron 表达式:每天 1 点执行
public void cleanCache() {
// 清理缓存逻辑
}
}

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

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

相关文章

Gevent和Subprocess问题

Gevent和Subprocess问题Gevent和Subprocess问题 1、复现 在main文件中调用gevent、并做了monkey pathch, 然后再调用subprocess.Popen(),出现一直卡住的问题Python 标准库里的很多 IO(网络 socket、ssl、time.sleep…

WPF ListBox loaded 76.6M items with imagesource

Install-Package Microsoft.Extensions.DependencyInjection; Install-Package CommunityToolkit.mvvm; public async Task InitDataAsync() {watch.Start();string imgDir = @"../../../Images";if (!Direc…

Ansible自动化运维实战 - 详解

Ansible自动化运维实战 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

建筑行业能源管理破局:MyEMS 打造商业楼宇 “能耗可视化 + 智能调控” 方案

在建筑行业的可持续发展浪潮中,商业楼宇正面临着巨大的能源管理压力。高昂的运营成本、日趋严格的碳排政策以及业主与租户对舒适环境日益增长的需求,共同构成了行业必须面对的挑战。传统的能源管理方式往往依赖于人工…

【数据结构】双向链表 - 指南

【数据结构】双向链表 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

告别“能源糊涂账”:MyEMS如何帮企业把能耗数据“算明白、用到位”

对于许多企业而言,能源成本是运营中一笔不小的开支,但却常常是一笔“糊涂账”。电费账单只有一个总数,只知道“花了多少钱”,却不知道“钱花在了哪里”、“谁在用”、“什么时候用的”、“有没有浪费”。这种粗放式…

完整教程:ElasticSearch倒排索引原理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Windows 离线环境下使用 VS Code 连接容器 Python 环境完整指南(亲测可用)

前言 在离线服务器环境中进行 Python 开发时,如何利用 VS Code 的强大功能进行调试和开发是一个常见需求。本文将详细介绍如何在 Windows 离线环境下,通过 WSL 和 Docker 容器实现 VS Code 连接 Python 环境的完整方…

Macos 安装kali报错

执行某个安装步骤失败。您可以尝试从菜单中重新运行这个失败的项目, 或跳过它并选择其他项目。失败的步骤是:选择并安装软件 选择语言的时候选择英文就能安装了。不清楚是什么原因

负载排查和分析二

负载排查和分析二明白了,我来帮你做两件事:改进中断部分:完善硬中断、软中断触发机制和它们之间的关联关系,增加图示和说明。优化整个文档美观性:用清晰的表格、层次分明的标题、缩进流程图、代码块高亮,保证可读…

负载排查和分析三

负载排查和分析三明白了,你希望 Step1: 基础统计 能够做到真正的 闭环诊断,即不仅有指标解释,还要告诉用户:可能现象(系统表现或问题)分析工具/命令(如何收集更多数据或验证)分析方法(指标和现象的对应关系、…

完整教程:线程、进程、协程

完整教程:线程、进程、协程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

CF913G Power Substring

推歌:SPOTLIGHT HUNTER 麦晓雯联动出了,没抽到。我爸把我 75 研究卷霍霍露娜上了导致我没法免费保底。诋毁他。 洛谷传送 说回正题。设 \(a\) 有 \(n\) 位,所求的 \(a\) 在 \(2^k\) 中距离末位的位数为 \(m\),显然…

深入解析:老树发新芽:六西格玛培训为石油机械制造注入持久活力

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

YC大佬分享的 10 个 vibe coding技巧,看完收获巨大

1、当 AI 卡住的时候切换战场。 问题: 当你在使用 cursor claude code 这样的 AI 编程工具,在编程的时候,如果遇到 AI 无法实现某个功能或者无法修复某一个错误,并且反复尝试都失败(陷入逻辑死循环) 技巧: 这时…

ES集群部署-EFK架构实战 - 实践

ES集群部署-EFK架构实战 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…

《BOE解忧实验室》第四季圆满收官 以科技重塑文化生活新范式

9月10日,由 BOE(京东方)自制的技术科普综艺节目《BOE解忧实验室》第四季迎来收官,全平台累计曝光量突破4.79亿,成为科技企业破圈营销行业示范标杆。作为中国科技企业首档技术科普综艺,本季节目以“中国地标+科技…

洛谷P2261 [CQOI2007] 余数求和

原题 题目描述 给出正整数\(n\)和\(k\), 请计算 \[G(n, k) = \sum_{i=1}^{n} k \bmod i \]其中\(k \bmod i\)表示k除以i的余数。 输入格式 输入只有一行两个整数,分别表示\(n\)和\(k\)。 输出格式 输出一行一个整数表…

负载排查和优化

负载排查和优化 Linux 网络优化与性能分析完全指南1️⃣ 中断与软中断基础 1.1 中断(IRQ)概念定义:CPU 在执行任务时,外设或内核事件请求 CPU 立即响应。作用:及时处理外设请求和系统事件,保证系统响应及时、稳定…

挑战骑行距离新记录:46公里

挑战骑行距离新记录:46公里周末要去江浦一趟,之前都是坐地铁转公交,这次突发奇想,干脆骑车去,反正时间比较充裕,于是早上8点半左右从住处出发,到中午11点53分到达,全长46公里左右(中间还走错一段路),用时3小…