SpringBoot左脚进门之常用注解

  1. 类级别注解
  • @SpringBootApplication
@Configuration                             //表明这是一个配置类
@EnableAutoConfiguration        //开启自动配置
@ComponentScan()                        //开启组件扫描

1、@Configuration:

当一个类被 @Configuration 注解时,它就被标识为一个配置类。这意味着该类可以包含一个或多个使用 @Bean 注解的方法,这些方法会返回对象实例,并且这些对象会被注册为 Spring 应用上下文中的 bean。

2、@EnableAutoConfiguration:

允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。

@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法:

👉 从配置文件META-INF/spring.factories加载所有可能用到的自动配置类

👉 去重,并将exclude和excludeName属性携带的类排除;

在这个例子中,DataSourceAutoConfiguration.class 被明确地从自动配置过程中排除了。这意味着即使你的项目中有数据库相关的依赖(例如 HikariCP, JDBC, 或者某个 ORM 框架),Spring Boot 不会自动配置数据源相关的组件。这通常是在你想要自定义数据源配置或完全不使用数据源时有用。

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {// ...
}
@SpringBootApplication(excludeName = "org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration")
public class MyApplication {// ...
}

👉 过滤,将满足条件(@Conditional)的自动配置类返回;

在这个例子中,只有当应用程序的配置文件中设置了 feature.enabled=true 时,才会创建 MyFeature Bean。

@Configuration
public class FeatureConfig {@Bean@ConditionalOnProperty(name = "feature.enabled", havingValue = "true")public MyFeature myFeature() {return new MyFeature();}
}

3、@ComponentScan()

通过 @ComponentScan,开发者不再需要手动在 XML 或 Java 配置类中定义每个组件作为 bean。只要一个类被适当注解了(例如 @Component),并且位于扫描路径下,Spring 就会自动将其注册为容器中的 bean。

@Configuration
@ComponentScan(basePackages = "com.example",includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MyInterface.class),useDefaultFilters = false
)
public class AppConfig {// ...
}

  1. 依赖注入注解

1、@Autowired

使用 @Autowired 注解,Spring 容器能够自动发现并注入所需的依赖项。这意味着你不需要显式地创建依赖对象的实例,而是让 Spring 来负责管理和提供这些依赖。

@Repository
public class MyRepositoryImpl implements MyRepository {// Implementation...
}@Service
public class MyService {private final MyRepository myRepository;// 即使没有 @Autowired 注解,Spring 也会自动注入 MyRepository 实现public MyService(MyRepository myRepository) {this.myRepository = myRepository;}// Methods...
}

如果一个类有多个构造函数,那么你需要至少在一个构造函数上使用 @Autowired 注解,以便告诉 Spring 哪个构造函数应该用于依赖注入。否则,Spring 不知道应该选择哪个构造函数来进行注入。

@Service
public class MyService {private final MyRepository myRepository;private final AnotherDependency anotherDependency;// 主构造函数,使用 @Autowired 标记@Autowiredpublic MyService(MyRepository myRepository, AnotherDependency anotherDependency) {this.myRepository = myRepository;this.anotherDependency = anotherDependency;}// 辅助构造函数,不会被 Spring 用来进行依赖注入public MyService() {this(null, null); // 或者其他逻辑}// Methods...
}

2、@Qualifier

用于在存在多个相同类型的 bean 时,明确指定要注入哪一个特定的 bean。它可以帮助解决当有多个候选 bean 时,Spring 容器无法确定应该选择哪个 bean 进行依赖注入的问题。

@Component("serviceImpl1")
public class MyServiceImpl1 implements MyService {// Implementation...
}@Component("serviceImpl2")
public class MyServiceImpl2 implements MyService {// Implementation...
}@Service
public class MyConsumer {private final MyService myService;@Autowiredpublic MyConsumer(@CustomQualifier("serviceImpl1") MyService myService) {this.myService = myService;}// Methods...
}

3、@Resource

主要用于查找和注入资源,如 EJB、数据源等,并且默认情况下是基于名称匹配的。如果找不到指定名称的 bean,则会尝试根据类型进行匹配。

  1. 请求处理注解

1、@RestController

主要用于构建 RESTful Web 服务。它结合了 @Controller 和 @ResponseBody 注解的功能,使得标记了该注解的类可以自动将返回的对象序列化为 JSON 或 XML 格式,并直接写入 HTTP 响应体中。

@RestController
@RequestMapping("/api")
public class MyRestController {@Autowiredprivate MyService myService;// GET 请求,获取资源列表@GetMapping("/items")public List<Item> getAllItems() {return myService.getAllItems();}// POST 请求,创建新资源@PostMapping("/items")public Item createItem(@RequestBody Item newItem) {return myService.createItem(newItem);}// PUT 请求,更新现有资源@PutMapping("/items/{id}")public Item updateItem(@PathVariable Long id, @RequestBody Item updatedItem) {return myService.updateItem(id, updatedItem);}// DELETE 请求,删除资源@DeleteMapping("/items/{id}")public void deleteItem(@PathVariable Long id) {myService.deleteItem(id);}
}

2、@RequestParam

用于将 HTTP 请求中的查询参数(即 URL 中 ? 后面的部分)绑定到控制器方法的参数上。它使得从 HTTP 请求中提取和处理参数变得更加简单和直观。

@GetMapping("/greet")
public String greetUser(@RequestParam("name") String name) {return "Hello, " + name + "!";
}@GetMapping("/greet")
public String greetUser(@RequestParam(name = "name", required = false, defaultValue = "Guest") String name) {return "Hello, " + name + "!";
}@GetMapping("/search")
public List<Item> searchItems(@RequestParam("tags") String[] tags) {// 处理 tags 数组...return itemService.findByTags(tags);
}@GetMapping("/query")
public String handleQueryParams(@RequestParam Map<String, String> allParams) {// 处理 allParams map...return "Received parameters: " + allParams;
}@GetMapping("/search")
public List<Item> searchItems(@Valid @RequestParam SearchCriteria criteria, BindingResult result) {if (result.hasErrors()) {// Handle validation errors...}// Process valid criteria...return itemService.search(criteria);
}
  1. 数据校验注解

1、@Valid

用于触发对方法参数或返回值的验证。

public class UserDTO {@NotNull(message = "Name is required")private String name;@Email(message = "Email should be valid")private String email;@Min(value = 18, message = "Age must be at least 18")private int age;// getters and setters...
}
@RestController
@RequestMapping("/users")
public class UserController {@PostMappingpublic ResponseEntity<String> createUser(@Valid @RequestBody UserDTO user, BindingResult bindingResult) {if (bindingResult.hasErrors()) {return new ResponseEntity<>(bindingResult.getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(", ")), HttpStatus.BAD_REQUEST);}// 处理有效的用户数据...return new ResponseEntity<>("User created successfully", HttpStatus.CREATED);}
}
public interface CreateValidation {}
public interface UpdateValidation {}public class UserDTO {@NotNull(groups = CreateValidation.class, message = "Name is required for creation")@Size(min = 1, max = 50, groups = {CreateValidation.class, UpdateValidation.class}, message = "Name size must be between 1 and 50")private String name;// 其他字段...// getters and setters...
}@RestController
@RequestMapping("/users")
public class UserController {@PostMappingpublic ResponseEntity<String> createUser(@Validated(CreateValidation.class) @RequestBody UserDTO user, BindingResult bindingResult) {// 处理创建用户的逻辑...}@PutMapping("/{id}")public ResponseEntity<String> updateUser(@PathVariable Long id, @Validated(UpdateValidation.class) @RequestBody UserDTO user, BindingResult bindingResult) {// 处理更新用户的逻辑...}
}
  1. 事务管理注解

1、@Transactional

用于管理声明式事务。它允许开发者以一种非侵入性的方式定义哪些方法应该参与事务管理,而不需要在代码中显式地编写事务处理逻辑(如开启事务、提交或回滚)。

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;// 方法默认使用 REQUIRED 传播行为和默认隔离级别@Transactionalpublic void createUser(User user) {userRepository.save(user);// 其他业务逻辑...}
}
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactional(propagation = Propagation.REQUIRES_NEW, // 创建新的事务isolation = Isolation.SERIALIZABLE,      // 设置最高的隔离级别readOnly = false,                       // 非只读事务rollbackFor = {IllegalArgumentException.class} // 指定哪些异常会导致回滚)public void updateUser(User user) throws Exception {if (user.getId() == null) {throw new IllegalArgumentException("User ID cannot be null");}userRepository.update(user);// 其他业务逻辑...}
}
  1. 条件注解

1、@ConditionalOnProperty

用于根据配置文件中的属性值决定是否应该创建某个 bean 或执行某些配置。它使得应用程序能够更加灵活地响应不同的环境或配置需求,例如在开发、测试和生产环境中启用或禁用特定的功能模块。

//只有当应用程序配置文件中存在名为 myfeature.enabled 的属性,并且其值为 "true" 时,MyFeatureConfiguration 类才会生效,进而创建并注册 MyFeatureService bean。如果 myfeature.enabled 不存在或其值不是 "true",那么 MyFeatureConfiguration 类及其内部定义的 bean 将不会被创建。//atchIfMissing = false:如果配置文件中没有定义 myfeature.enabled 属性,则不匹配(即不会创建 bean)。如果设置为 true,则即使属性不存在也会创建 bean。@Configuration
@ConditionalOnProperty(name = "myfeature.enabled", havingValue = "true", matchIfMissing = false)
public class MyFeatureConfiguration {@Beanpublic MyFeatureService myFeatureService() {return new MyFeatureServiceImpl();}
}
@Configuration
@ConditionalOnProperty({@ConditionalOnProperty.Property(name = "service.a.enabled", havingValue = "true"),@ConditionalOnProperty.Property(name = "service.b.enabled", havingValue = "false")
})
public class ConditionalConfiguration {@Beanpublic ComplexService complexService() {return new ComplexServiceImpl();}
}
@Configuration
@ConditionalOnProperty(name = "environment.type", regex = "^(dev|test)$")
public class DevelopmentOrTestConfig {@Beanpublic SpecialService specialService() {return new SpecialServiceImpl();}
}
  1. 异常处理注解

1、@ControllerAdvice 标记了一个类作为全局异常处理器。

2、@ExceptionHandler 注解用于定义具体的异常处理逻辑。

@ControllerAdvice
public class GlobalExceptionHandler {// 处理所有未捕获的运行时异常@ExceptionHandler(RuntimeException.class)public ResponseEntity<ErrorResponse> handleRuntimeException(RuntimeException ex) {ErrorResponse error = new ErrorResponse("INTERNAL_ERROR", "An internal error occurred: " + ex.getMessage());return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);}// 处理自定义异常@ExceptionHandler(MyCustomException.class)public ResponseEntity<ErrorResponse> handleMyCustomException(MyCustomException ex) {ErrorResponse error = new ErrorResponse("CUSTOM_ERROR", ex.getMessage());return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);}
}

可以通过 basePackages 或 assignableTypes 属性来限制其作用范围:

@ControllerAdvice(basePackages = "com.example.web")
public class WebLayerGlobalExceptionHandler {// 异常处理逻辑...
}

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

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

相关文章

CNCF云原生生态版图

CNCF云原生生态版图 概述什么是云原生生态版图如何使用生态版图 项目和产品&#xff08;Projects and products&#xff09;会员&#xff08;Members&#xff09;认证合作伙伴与提供商&#xff08;Certified partners and providers&#xff09;无服务&#xff08;Serverless&a…

电子应用设计方案-50:智能牙刷系统方案设计

智能牙刷系统方案设计 一、引言 随着人们对口腔健康的重视程度不断提高&#xff0c;智能牙刷作为一种创新的口腔护理工具&#xff0c;能够更有效地帮助用户改善刷牙习惯和清洁效果。本方案旨在设计一款功能丰富、智能化程度高的智能牙刷系统。 二、系统概述 1. 系统目标 - 准…

遗传算法与深度学习实战(27)——进化卷积神经网络

遗传算法与深度学习实战&#xff08;27&#xff09;——进化卷积神经网络 0. 前言1. 自定义交叉算子2. 自定义突变操作符3. 进化卷积神经网络小结系列链接 0. 前言 DEAP toolbox 中提供的标准遗传操作符对于自定义的网络架构基因序列来说是不够的。这是因为任何标准的交叉算子…

希迪智驾持续亏损8.2亿:毛利率下滑,冲刺“自动驾驶矿卡第一股”

《港湾商业观察》黄懿 近日&#xff0c;希迪智驾&#xff08;湖南&#xff09;股份有限公司&#xff08;下称“希迪智驾”&#xff09;向港交所主板递交上市申请&#xff0c;联席保荐人为中金公司、中信建投国际、中国平安资本&#xff08;香港&#xff09;。 资料显示&#…

【0x0008】HCI_Create_Connection_Cancel命令详解

目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Create_Connection_Cancel 命令格式 2.2. BD_ADDR 三、返回事件及参数说明 3.1. HCI_Command_Complete 事件 3.2. HCI_Connection_Complete 事件 四、命令执行流程梳理 4.1. 命令发起 4.2. 命令接收与初步判断 4…

Elasticsearch Serverless 中的数据流自动分片

作者&#xff1a;来自 Elastic Andrei Dan 在 Elastic Cloud Serverless 中&#xff0c;我们根据索引负载自动为数据流配置最佳分片数量&#xff0c;从而使用户无需摆弄分片。 传统上&#xff0c;用户会更改数据流的分片配置&#xff0c;以处理各种工作负载并充分利用可用资源。…

Pytest-Bdd-Playwright 系列教程(15):背景(Background)

Pytest-Bdd-Playwright 系列教程&#xff08;15&#xff09;&#xff1a;背景&#xff08;Background&#xff09; 前言一、什么是背景&#xff08;Background&#xff09;二、特性文件三、测试脚本四、运行测试总结 前言 在测试的过程中&#xff0c;我们往往会遇到这样的问题&…

Excel + Notepad + CMD 命令行批量修改文件名

注意&#xff1a;该方式为直接修改原文件的文件名&#xff0c;不会生成新文件 新建Excel文件 A列&#xff1a;固定为 renB列&#xff1a;原文件名称C列&#xff1a;修改后保存的名称B列、C列&#xff0c;需要带文件后缀&#xff0c;为txt文件就是.txt结尾&#xff0c;为png图片…

GESP202412 八级【排队】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202412 八级] 排队 题目描述 小杨所在班级共有 n n n 位同学&#xff0c;依次以 1 , 2 , … , n 1,2,\dots,n 1,2,…,n 标号。这 n n n 位同学想排成一行队伍&#xff0c;其中有些同学之间关系非常好&#xff0c;在队伍里需要排在…

Ubuntu22.04 docker如何发布镜像(和用git差不多)

在dockerhub上创建远程仓库&#xff1a;https://hub.docker.com/ 将本地镜像打tag&#xff0c;并修改成可以上传到 dockerhub 的形式 # 查看本地镜像# 修改镜像 ## docker tag 镜像名称:标签 新的镜像名称&#xff08;要和远程仓库dockerhub上的一致&#xff09;:新的标签pus…

C#中的string操作详解-截取、分割、连接、替换等

在C#中&#xff0c;string 类提供了许多用于操作字符串的方法&#xff0c;包括截取、分隔和连接等。以下是一些常用字符串操作的介绍和实例&#xff1a; 1. 截取字符串 Substring 方法 用于从字符串中截取子字符串。 语法&#xff1a; //从startIndex开始截取&#xff0c;…

26. Three.js案例-自定义多面体

26. Three.js案例-自定义多面体 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它支持 WebGL 渲染&#xff0c;并提供了多种配置选项。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…

【IC面试问题:UCIE PHY LSM AXI Cache】

IC面试问题&#xff1a;UCIE PHY LSM && AXI && Cache 1 UCIE PHY LSM有几种状态&#xff1f; 以及L1和L2这两种低功耗状态有什么区别&#xff1f;2 AXI的特性&#xff1f; 通道之间有依赖关系吗&#xff1f; master和slave的valid和ready关系&#xff1f; 写数…

PPT技巧:将幻灯片里的图片背景设置为透明

在PPT中添加了图片&#xff0c;想要将图片中的背景设置为透明或者想要抠图&#xff0c;有什么方法吗&#xff1f;今天分享两个方法。 方法一&#xff1a; 添加图片&#xff0c;选中图片之后&#xff0c;点击【图片格式】功能&#xff0c;点击最左边的【删除背景】 PPT会自动帮…

池化在深度学习中增强特征的作用

目录 ​编辑 引言 池化的基本作用与特征降维 池化的定义与目的 池化操作的实现 提取关键特征与计算效率的提升 池化对特征提取的影响 平均池化的应用 提高特征鲁棒性与过拟合的防止 池化对模型鲁棒性的贡献 池化防止过拟合的原理 增强多级特征与特征表达能力的提升…

分布式 Raft算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & Raft算法 & 总结》《分布式 & Raft算法 & 问题》 参考文献 《Raft一致性算法论文译文》《深入剖析共识性算法 Raft》 简介 Raft 木筏是一种基于日志复制实现的分布式容错&一致性算法。在Raft算法…

基于强化学习Q-learning算法的栅格地图路径规划算法,可以更改地图大小及起始点,可以自定义障碍物,MATLAB代码

Q-learning是一种无模型的强化学习算法&#xff0c;它允许智能体&#xff08;agent&#xff09;在与环境&#xff08;environment&#xff09;交互的过程中学习如何通过执行动作&#xff08;actions&#xff09;来最大化累积奖励&#xff08;cumulative rewards&#xff09;。 …

JAVA学习笔记——第十一章 枚举和注解

一、引出枚举类 1.先看一个需求demo package com.hspedu.enum_;public class Enumration01 {public static void main(String[] args) {Season Spring new Season("春天", "温暖");Season Summer new Season("夏天", "炎热");Seas…

腾讯微信Android面试题及参考答案(多张原理图)

Android 应用的启动流程如下&#xff1a; 当用户点击应用图标时&#xff0c;首先会通过 Launcher&#xff08;桌面启动器&#xff09;来响应这个操作。Launcher 本身也是一个 Android 应用&#xff0c;它运行在系统中&#xff0c;负责管理和显示桌面上的图标等信息。 系统会检查…

SQL server学习02-使用T-SQL创建数据库

目录 一&#xff0c; 使用T-SQL创建数据库 1&#xff0c;数据库的存储结构 2&#xff0c;创建数据库的语法结构 1&#xff09;使用T-SQL创建学生成绩管理数据库 二&#xff0c;使用T-SQL修改数据库 1&#xff0c;修改数据库的语法结构 1&#xff09;修改学生成绩管理数…