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.mzph.cn/diannao/63782.shtml

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

相关文章

刷题日志【4】

目录 1、猜数字大小 1、猜数字大小 题意有点抽象&#xff0c;我大概讲一下&#xff0c;就是在1——n里面会有一个目标数&#xff0c;我们通过猜数字的方式逼近这个数字&#xff0c;直到解出这个数&#xff0c;之前我们是用二分法求最快达到求解的问题&#xff0c;这道题多了每…

【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现环形队列的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 初始化队列、销毁队列、判断队列是否为空、进队列…

一个简单带颜色的Map

越简单 越实用。越少设计&#xff0c;越易懂。 需求背景&#xff1a; 创建方法&#xff0c;声明一个hashset&#xff0c; 元素为 {“#DE3200”, “#FA8C00”, “#027B00”, “#27B600”, “#5EB600”} 。 对应的key为 key1 、key2、key3、key4、key5。 封装该方法&#xff0c…

恋爱脑学Rust之并行之旅:Rayon介绍和使用

文章目录 一、开启爱情的依赖之旅&#xff08;安装 Rayon&#xff09;二、甜蜜瞬间的并行享受&#xff08;基本数据并行操作&#xff09;&#xff08;一&#xff09;共享美好时光&#xff08;par_iter 方法&#xff09;&#xff08;二&#xff09;分块珍藏回忆&#xff08;par_…

素数对

素数对 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 两个相差为2的素数称为素数对&#xff0c;如5和7&#xff0c;17和19等&#xff0c;本题目要求找出所有两个数均不大于n的素数对。 输入 一个正整…

cpptoml介绍

cpptoml 是一个用于 C 的开源库&#xff0c;旨在提供对 TOML&#xff08;Toms Obvious, Minimal Language&#xff09;格式的支持。它允许开发者轻松地在 C 项目中读取、解析和生成 TOML 格式的配置文件。cpptoml 是一个轻量级、易于使用的库&#xff0c;适用于那些希望将 TOML…

公有云和私有云的区别

目录 ​1、公有云&#xff08;PublicClouds&#xff09; ​2、私有云&#xff08;PrivateClouds&#xff09; ​2.1 私有云又分为两种 3、混合云&#xff08;hybrid cloud&#xff09; ​3.1 公有云和私有云的区别 ​3.2 选择公有云或者是私有云 4 政务云&#xff08;Go…

嵌入式硬件-- 元器件焊接

1.锡膏的使用 锡膏要保存在冰箱里。 焊接排线端子&#xff1b;138度的低温锡&#xff08;锡膏&#xff09;&#xff0c; 第一次使用&#xff0c;直接拿东西挑一点涂在引脚上&#xff0c;不知道多少合适&#xff0c;加热台加热到260左右&#xff0c;放在上面观察锡融化&#…

六、nginx负载均衡

负载均衡&#xff1a;将四层或者七层的请求分配到多台后端的服务器上。 从而分担整个业务的负载。提高系统的稳定性&#xff0c;也可以提高高可用&#xff08;备灾&#xff0c;其中一台后端服务器如果发生故障不影响整体业务&#xff09;. 负载均衡的算法 round robin 轮询 r…

【C++算法】40.模拟_N 字形变换

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a; 题目链接&#xff1a; 6. N 字形变换 题目描述&#xff1a; 解法 解法一&#xff1a;模拟 a,b,c,d,e,f,g...... n4 弄个矩阵放进去&#xff0c;最后从左往右读取。 解法二&#xff1a;模拟优化-…

访问者模式的理解和实践

在软件开发过程中&#xff0c;设计模式为我们提供了解决常见问题的最佳实践。访问者模式&#xff08;Visitor Pattern&#xff09;是行为设计模式之一&#xff0c;它将数据操作与数据结构分离&#xff0c;使得在不修改数据结构的前提下&#xff0c;能够定义作用于这些元素的新的…

Jenkins:持续集成与持续部署的利器

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是Jenkins 2、Jenkins的起源 二、Jenkins的核心…

java中的数组(4)

大家好&#xff0c;今天是java数组的最后一篇&#xff0c;我来为大家介绍数组中一些常见用法&#xff0c;那么我们直接发车。 五.作为函数的返回值. 1数组对象在堆上,不会因为局部变量的销段而销毁. 2.new开辟新空间. 3.数组对象是在堆上的. 4.引用变量目前是在main函数里…

从SRE视角透视DevOps的构建精髓

SRE 侧重系统稳定性&#xff0c;DevOps 强调开发运维协作。SRE 实践助力DevOps&#xff0c;提升系统稳定性与团队协作效率。 SRE 运用软件工程的原理&#xff0c;将系统管理员的手工任务自动化&#xff0c;负责运维由系统组件构成的服务&#xff0c;确保服务稳定运行。SRE职责涵…

关于Redis哨兵机制实验操作步骤

需要搭建帮助的可以去taobao搜索Easy Company技术服务&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 需要搭建帮助的可以去taobao搜索Easy Company技术服务&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 一、配置哨兵(sentinel) 创建三个哨兵配置文件&…

基于51单片机的智能门禁系统设计与实现

1. 项目背景与需求分析 随着社会的不断发展&#xff0c;智能化门禁系统在现代安全领域应用越来越广泛。智能门禁系统通过单片机的控制功能&#xff0c;结合指纹模块和液晶显示模块&#xff0c;能够实现便捷、高效、安全的身份认证管理。基于STC89C52单片机的设计&#xff0c;具…

【大前端vue:组件】vue鼠标滑动:平滑滚动效果 向左、向右

【大前端vue&#xff1a;组件】vue鼠标滑动&#xff1a;平滑滚动效果 向左、向右 <template><div class"tab-container"><div class"tab-wrapper"><h2 class"main-title">鼠标滑动&#xff1a;平滑滚动效果 向左、向右…

某养老产业公司管理诊断项目成功案例纪实

某养老产业公司管理诊断项目成功案例纪实 ——从短期和长期出发&#xff0c;提供转型改革建议 【客户行业】养老行业 【问题类型】问题诊断 【客户背景】 某养老产业公司是一家主要从事养老服务为主的企业&#xff0c;主营业务包括社区养老服务、居家养老、康复训练服务等…

Python的3D可视化库【vedo】1-4 (visual模块) 体素可视化、光照控制、Actor2D对象

文章目录 6. VolumeVisual6.1 关于体素6.2 显示效果6.2.1 遮蔽6.2.2 木纹或磨砂效果 6.3 颜色和透明度6.3.1 透明度衰减单位6.3.2 划分透明度标量梯度6.3.3 设置颜色或渐变6.3.4 标量的计算模式6.3.5 标量的插值方式 6.4 过滤6.4.1 按单元格id隐藏单元格6.4.2 按二进制矩阵设置…

DAY5 C++运算符重载

1.类实现> 、<、!、||、&#xff01;和后自增、前自减、后自减运算符的重载 代码&#xff1a; #include <iostream>using namespace std; class Complex {int rel;int vir; public:Complex(){};Complex(int rel,int vir):rel(rel),vir(vir){cout << "…