SpringBoot 注解全解析

注解的优势:

  • 采用纯 java 代码,不在需要配置繁杂的 xml 文件
  • 在配置中也可享受面向对象带来的好处
  • 类型安全对重构可以提供良好的支持
  • 减少复杂配置文件的同时亦能享受到 springIoC 容器提供的功能

1. 常用的Spring Boot注释及其用途和示例

1)@SpringBootApplication

这是一个组合注解,它包含了 @Configuration,@EnableAutoConfiguration 和 @ComponentScan 三个注解。它的作用是标记 Spring Boot 应用的主类,让 Spring Boot 自动进行必要的配置,扫描并加载符合条件的组件或 bean 定义,启动内嵌的 web 服务器等。一般来说,我们只需要在主类上添加这个注解,就可以快速启动一个 Spring Boot 应用。

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

2)@RestController

这是一个组合注解,它包含了 @Controller 和 @ResponseBody 两个注解。它的作用是标记一个控制器类,表示该类的所有方法的返回值都直接写入 HTTP 响应体中,而不是解析为跳转路径。这个注解通常用于构建 RESTful 的 API,返回 JSON 或 XML 格式的数据。

@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User getUser(@PathVariable("id") Long id) {return userService.getUserById(id);}
}

3)@RequestMapping

这是一个用于映射 HTTP 请求的注解,它可以用在类或方法上。它的作用是指定一个或多个请求路径,以及对应的请求方法,请求参数,请求头等条件,将其绑定到一个控制器方法上。它还可以指定一个返回值的媒体类型,以及一个视图名称等属性。

@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {return "Hello, Spring Boot!";
}

4)@GetMapping、@PostMapping、 @PutMapping、 @DeleteMapping、@PatchMapping

这些注解都是 @RequestMapping 的缩写,它们分别对应了 GET, POST, PUT, DELETE, PATCH 这五种 HTTP 请求方法。它们的作用是简化 @RequestMapping 的写法,只需要指定一个请求路径即可,其他属性都有默认值。它们的用法和 @RequestMapping 类似,只是更加简洁。

@GetMapping("/hello")
public String hello() {return "Hello, Spring Boot!";
}@PostMapping("/users")
public User createUser(@RequestBody User user) {return userService.saveUser(user);
}

5)@PathVariable、@RequestParam、@RequestBody、 @RequestHeader、 @CookieValue

这些注解都是用于获取 HTTP 请求中的数据的注解,它们可以用在控制器方法的参数上。它们的作用是分别从请求路径,请求参数,请求体,请求头,或 Cookie 中获取数据,并将其绑定到方法参数上。它们都可以指定一个参数名,以及一个是否必须的属性。

@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") Long id) {return userService.getUserById(id);
}@GetMapping("/users")
public List<User> getUsers(@RequestParam(value = "name", required = false) String name) {return userService.getUsersByName(name);
}@PostMapping("/users")
public User createUser(@RequestBody User user) {return userService.saveUser(user);
}@GetMapping("/hello")
public String hello(@RequestHeader("User-Agent") String userAgent) {return "Hello, your user agent is: " + userAgent;
}@GetMapping("/cookie")
public String cookie(@CookieValue("JSESSIONID") String sessionId) {return "Your session id is: " + sessionId;
}

6)@Autowired、@Resource、@Inject

这些注解都是用于实现依赖注入的注解,它们可以用在字段,构造器,或方法上。它们的作用是从 Spring 容器中获取一个 bean 实例,并将其赋值给被注解的元素。它们的区别是:

  • @Autowired 是 Spring 提供的注解,它默认按照类型匹配 bean,也可以通过 @Qualifier 指定按照名称匹配。
  • @Resource 是 Java 标准提供的注解,它默认按照名称匹配 bean,也可以通过 type 属性指定按照类型匹配。
  • @Inject 是 Java 标准提供的注解,它和 @Autowired 类似,都是按照类型匹配 bean,但是它需要依赖 JSR-330 的实现,如 Google Guice。
@Service
public class UserService {@Autowiredprivate UserDao userDao;@Resource(name = "userCache")private Cache userCache;@Injectprivate PasswordEncoder passwordEncoder;// ...
}

7)@Bean、@Component、 @Service、@Repository、 @Controller

这些注解都是用于声明一个 bean 的注解,它们可以用在类上。它们的作用是让 Spring 容器扫描并识别这些类,将其实例化并加入到容器中,以便其他组件可以使用。它们的区别是:

  • @Bean 是用在方法上的,它表示该方法返回一个 bean 实例,方法所在的类必须被 @Configuration 注解标记。
  • @Component 是一个通用的注解,它表示该类是一个组件,没有特殊的功能。
  • @Service 是一个业务逻辑层的注解,它表示该类是一个服务类,提供一些业务功能。
  • @Repository 是一个数据访问层的注解,它表示该类是一个数据访问对象,提供一些数据操作功能。
  • @Controller 是一个控制器层的注解,它表示该类是一个控制器类,处理 HTTP 请求。
@Configuration
public class AppConfig {@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}@Component
public class HelloComponent {public void sayHello() {System.out.println("Hello, Spring Boot!");}
}@Service
public class UserService {// ...
}@Repository
public class UserDao {// ...
}@Controller
public class UserController {// ...
}

8)@Value、 @ConfigurationProperties、 @PropertySource

这些注解都是用于配置属性的注解,它们可以用在类或字段上。它们的作用是从配置文件或环境变量中获取一些属性值,并将其赋值给被注解的元素。它们的区别是:

  • @Value 是用于获取单个属性值的,它可以使用 ${…} 占位符或 SpEL 表达式来获取属性值,也可以指定一个默认值。
  • @ConfigurationProperties 是用于获取一组属性值的,它可以使用 prefix 属性来指定一个属性前缀,然后将其下的所有属性值绑定到一个 bean 的字段上,支持松散绑定和类型转换,也支持 JSR-303 的数据校验。
  • @PropertySource 是用于指定一个额外的属性源的,它可以使用 value 属性来指定一个或多个属性文件的路径,然后将其加载到 Spring 环境中,以便其他注解可以使用。
@Component
@PropertySource("classpath:app.properties")
public class AppConfig {@Value("${app.name}")private String appName;@Value("${app.version:1.0}")private String appVersion;@Value("#{systemProperties['os.name']}")private String osName;// ...
}@Component
@ConfigurationProperties(prefix = "user")
@Validated
public class UserConfig {@NotBlankprivate String name;@Min(18)private int age;private List<String> hobbies;// getters and setters
}

9)@EnableAutoConfiguration

此注解用于启用 Spring Boot 的自动配置机制。它根据类路径依赖项和属性自动配置应用程序。他可以简化配置过程,从而实现快速开发。

例如

@SpringBootApplication
@EnableAutoConfiguration
public class MyApplication {// ...
}

有@EnableAutoConfiguration的情况下:

  • Spring Boot将会根据项目的依赖和配置,自动配置应用程序的各个组件,例如数据源、JPA、Web等。
  • MyService类会被自动扫描并纳入Spring容器管理。

没有@EnableAutoConfiguration的情况下:

  • 我们需要手动配置应用程序的各个组件,例如配置数据源、JPA、Web等,这会增加开发工作量。
  • MyService类不会被自动扫描,需要显式配置才能被Spring容器管理

如果发现正在应用不需要的特定自动配置类,则可以使用 @EnableAutoConfiguration 的 exclude 属性 来禁用它们

例如

@EnableAutoConfiguration(excludeName = {"org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration",
"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"})

10)@ConditionalOnProperty

此注解用于根据属性的值有条件地启用或禁用 bean 或配置。

例如

@Configuration
@ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true")
public class MyConfiguration {// 当启用时的功能配置
}

11)@Scheduled

此注解用于以固定的时间间隔调度方法的执行。

例如

@Component
public class MyScheduler {@Scheduled(fixedDelay = 5000)public void doSomething() {// 定期执行任务}
}

12)@Cacheable、@CachePut、@CacheEvict

这些注解用于缓存方法结果。它们允许您分别缓存方法的返回值、更新缓存或去除缓存。

@Service
public class MyService {@Cacheable("users")public User getUserById(Long id) {// 从数据库检索用户}@CachePut("users")public User updateUser(User user) {// 更新数据库和缓存中的用户}@CacheEvict("users")public void deleteUser(Long id) {// 从数据库删除用户并从缓存中移除}
}

13)@PostConstruct

@PostConstruct注解用于在依赖注入完成后,且在类的初始化之前执行标注的方法。这提供了一个非常方便的生命周期钩子,允许开发者在对象创建和依赖注入完成后执行初始化代码。

@Component
public class MyBean {@PostConstructpublic void init() {// 执行初始化操作,如加载配置文件,检查资源等System.out.println("MyBean is initialized");}
}

在上述代码中,init方法会在MyBean对象创建并注入所有必要的依赖之后被自动调用。

14)@ExceptionHandler、@ControllerAdvice

@ExceptionHandler注解用于处理Controller层抛出的异常。通过将此注解应用于方法上,可以捕获特定类型的异常,并对其进行自定义处理。

@ControllerAdvice最常见的用途之一是全局异常处理。通过在类上使用@ControllerAdvice注解,然后在该类中使用@ExceptionHandler注解标注的方法,可以捕获指定类型的异常,并进行处理。

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)public ResponseEntity<Object> handleException(Exception e) {// 构建自定义的响应体,如错误信息和错误码return new ResponseEntity<>("An error occurred", HttpStatus.INTERNAL_SERVER_ERROR);}
}

2. 面向切面的编程 (AOP) 注解

这些注解通常用于Spring框架中的面向切面编程(AOP,Aspect-Oriented Programming),于实现面向切面编程,将横切关注点从核心业务逻辑中分离出来,以提高代码的可维护性和可重用性。

1)@Aspect

这个注解用于声明一个类是一个切面类,定义切面类的时候需要添加这个注解。切面类是用来封装切面逻辑的类,通常包含一个或多个通知方法,以及一个或多个切点表达式。切面类需要被 Spring 容器管理,因此通常也需要添加 @Component 注解。例如:

@Aspect
@Component
public class LogAspect {// 通知方法和切点表达式
}

2)@Pointcut

这个注解用于定义一个切点表达式,指定哪些连接点(即方法执行的点)需要被拦截。切点表达式可以使用 AspectJ 的语法,也可以使用自定义的注解。切点表达式通常定义在一个空的方法上,作为一个标识符,供其他注解引用。例如:

@Pointcut("execution(* com.example.service.*.*(..))")
public void servicePointcut() {// 空方法,仅用于标识切点
}

这个注解表示,所有 com.example.service 包下的类的所有方法都是切点,需要被拦截。

3)@Before, @After, @AfterReturning, @AfterThrowing, @Around

这些注解都是用于定义通知方法的,指定在切点执行的不同阶段执行不同的逻辑。通知方法是用来实现切面功能的方法,通常需要引用一个切点表达式,或者一个切点标识符。这些注解的含义和用法如下:

  • @Before:表示在切点之前执行,可以用来做一些前置处理,如参数校验,日志打印等。
  • @After:表示在切点之后执行,无论切点是否正常返回或抛出异常,都会执行,可以用来做一些清理工作,如释放资源,还原状态等。
  • @AfterReturning:表示在切点正常返回之后执行,可以用来做一些后置处理,如返回结果处理,日志记录等。
  • @AfterThrowing:表示在切点抛出异常之后执行,可以用来做一些异常处理,如异常日志记录,事务回滚等。
  • @Around:表示环绕切点执行,可以在切点前后执行自定义的逻辑,也可以控制切点是否执行,以及修改切点的参数和返回值,是最强大也最复杂的通知类型。

例如:

@Before("servicePointcut()")
public void beforeAdvice(JoinPoint joinPoint) {// 获取方法签名和参数MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();Object[] args = joinPoint.getArgs();// 打印方法信息和参数System.out.println("Before advice: " + method + ", args: " + Arrays.toString(args));
}@AfterReturning(value = "servicePointcut()", returning = "result")
public void afterReturningAdvice(JoinPoint joinPoint, Object result) {// 获取方法签名和返回值MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();// 打印方法信息和返回值System.out.println("After returning advice: " + method + ", result: " + result);
}@AfterThrowing(value = "servicePointcut()", throwing = "ex")
public void afterThrowingAdvice(JoinPoint joinPoint, Exception ex) {// 获取方法签名和异常MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();// 打印方法信息和异常System.out.println("After throwing advice: " + method + ", exception: " + ex.getMessage());
}@Around("servicePointcut()")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {// 获取方法签名MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();// 记录方法开始时间long startTime = System.currentTimeMillis();// 执行切点方法Object result = joinPoint.proceed();// 记录方法结束时间long endTime = System.currentTimeMillis();// 计算方法耗时long duration = endTime - startTime;// 打印方法信息和耗时System.out.println("Around advice: " + method + ", duration: " + duration + " ms");// 返回结果return result;
}

4)@Order

这个注解用于指定切面类的优先级,当有多个切面类作用于同一个切点时,可以用这个注解来控制执行顺序。注解的值越小,优先级越高。例如:

@Aspect
@Component
@Order(1)
public class LogAspect {// ...
}@Aspect
@Component
@Order(2)
public class SecurityAspect {// ...
}

这个注解表示,LogAspect 的优先级高于 SecurityAspect,因此 LogAspect 的通知方法会先于 SecurityAspect 的通知方法执行。

3. 验证注释

​ 这些注解通常用于Java中的Bean Validation(JSR-380)规范中,用于对JavaBean属性进行验证

@Valid、@NotNull、@Size、@Min、@Max、@Email、@Pattern

  • @Valid,用于指示在验证嵌套对象时应该递归执行验证。通常与复杂对象的属性一起使用,以确保嵌套对象的所有属性都被验证。
  • @NotNull,用于验证属性值不能为null。
  • @Size,用于验证属性值的长度是否在指定范围内。
  • @Min,用于验证属性值是否大于等于指定的最小值。
  • @Max,用于验证属性值是否小于等于指定的最大值。
  • @Email,用于验证属性值是否符合Email地址的格式。
  • @Pattern,用于验证属性值是否匹配指定的正则表达式。

例如

public class Address {@NotNullprivate String street;// 其他属性和方法
}public class User {@Validprivate Address address;@NotNullprivate String username;@Size(min = 2, max = 50)private String username;@Min(18)private int age;@Max(100)private int age;@Emailprivate String email;@Pattern(regexp = "^[A-Za-z0-9]+$")private String username;// 其他属性和方法
}

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

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

相关文章

Java 中notify 和 notifyAll 方法介绍

1. notify 方法 notify() 方法是 Java 中 Object 类的一个方法&#xff0c;它用来唤醒在该对象的监视器&#xff08;monitor&#xff09;上等待的单个线程。如果有多个线程都在该对象上等待&#xff0c;则会随机唤醒其中一个线程。被唤醒的线程将会尝试重新获取对象锁&#xff…

idea集成git详解教程(实用篇)

0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可&#xff08;NEXT&#xff09; 2.软件测试 在Windows桌面空白处&#xff0c;点击鼠标右键&#xff0c;弹出右键菜单 Git软件安装后&#xff0c;会在右键菜单中增加两个菜单 Git GUI He…

matplotlib绘图中文乱码问题

如图所示&#xff0c;在使用python包matplotlib绘图时中文文字显示乱码&#xff0c;在绘图前加入以下两行代码即可 # 导入包 import matplotlib.pyplot as plt # 解决中文乱码问题 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False重新运行代…

Linux 进程的前台/后台切换

目录 前言 简单例子 前言 当你用shell启动一个程序时&#xff0c;往往他是在前台工作的。程序会一直占用终端命令行&#xff0c;例如你在前台解压的时候必须等着&#xff0c;期间干不了别的事&#xff08;除非另开一个终端&#xff09;。 例如经常用连接到远程服务器执行脚本…

【知识摘要】一文带你了解什么是RedLock。

1、什么是RedLock 红锁&#xff08;RedLock&#xff09;是一种分布式锁算法&#xff0c;由 Redis 的作者 Salvatore Sanfilippo&#xff08;也称为 Antirez&#xff09;设计&#xff0c;用于在分布式系统中实现可靠的锁机制。它的设计解决了单一 Redis 实例作为分布式锁可能出…

【Django】执行查询—跨关系查询中的跨多值关联问题

跨多值查询 跨越 ManyToManyField 或反查 ForeignKey &#xff08;例如从 Blog 到 Entry &#xff09;时&#xff0c;对多个属性进行过滤会产生这样的问题&#xff1a;是否要求每个属性都在同一个相关对象中重合。 filter() 先看filter()&#xff0c;通过一个例子看&#xf…

打造无缝滚动体验:JavaScript中的scrollIntoView()方法实战指南

在现代Web开发中&#xff0c;提升用户体验是至关重要的。通过JavaScript的scrollIntoView()方法&#xff0c;我们可以为用户创造出流畅而令人愉悦的滚动体验。本文将深入研究scrollIntoView()的强大功能&#xff0c;并结合实例演示如何在项目中巧妙应用&#xff0c;以打造出无缝…

缓存穿透解决方案之布隆过滤器

布隆过滤器可以快速判断数据是否存在&#xff0c;避免从数据库中查询数据是否存在&#xff0c;减轻数据库的压力 布隆过滤器是由一个初值为0的bit数组和N个哈希函数&#xff0c;可以用来快速的判断某个数据是否存在 当我们想要标记某个数据是否存在时&#xff0c;布隆过滤器会…

Java底层自学大纲_高可用篇

高可用专题_自学大纲所属类别学习主题建议课时&#xff08;h&#xff09; A 容器化技术001 Docker架构设计原理2.5 A 容器化技术002 Docker部署springboot项目2.5 A 容器化技术003 基于Docker-Compose部署微服务项目2.5 B Nginx实现高可用004 Nginx反向代理&负载均衡&a…

LabVIEW眼结膜微血管采集管理系统

LabVIEW眼结膜微血管采集管理系统 开发一套基于LabVIEW的全自动眼结膜微血管采集管理系统&#xff0c;以提高眼结膜微血管临床研究的效率。系统集成了自动化图像采集、图像质量优化和规范化数据管理等功能&#xff0c;有效缩短了图像采集时间&#xff0c;提高了图像质量&#…

idea 多模块A模块调用了B模块的Jar包,而非本地源码

1&#xff0c;问题描述 对于多模块的互相调用&#xff0c;比如模块A&#xff0c;模块B&#xff0c;模块C&#xff0c; 这在本地都是可以编辑进行开发的源码&#xff0c; 按理说是模块A可以直接点进模块B的本地源码&#xff0c; 但是不知道什么原因&#xff0c;导致模块A点进…

C++小记 - 二叉树

文章目录 二叉树一、二叉树理论基础篇二叉树的种类满二叉树完全二叉树二叉搜索树平衡二叉搜索树 二叉树的存储方式链式存储&#xff1a;顺序存储&#xff1a;遍历规则&#xff1a;构造实现&#xff1a; 二叉树的遍历方式二叉树的定义 二、二叉树的递归遍历递归算法的三个要素:递…

vue+element UI中给指定日期添加标记

1.日期控件中添加:picker-options属性&#xff0c;即:picker-options“myPickerOptions” <el-date-picker:class"item.scds !null ?xtsjBlue:xtsjRed"v-model"item.date"value-format"yyyy-MM-dd"type"date":picker-options"…

Python中的heapq模块

Python中的heapq模块 文章目录 Python中的heapq模块1.heapq的方法2.使用heapq创建堆3.使用heapq实现堆排序4.获取堆中的前n个最大值或最小值Reference heapq模块实现了堆队列的算法&#xff0c;即优先队列算法。heapq其实是实现了一种小顶堆&#xff0c;所以使用pop()方法返回的…

如何进行弱网测试?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 如今这个高度互联的时代里&#xff0c;网络环境对于应用程序的影响越来越重要。 而弱网测试就是…

leetcode--接雨水(双指针法,动态规划,单调栈)

目录 方法一&#xff1a;双指针法 方法二&#xff1a;动态规划 方法三&#xff1a;单调栈 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 黑色的是柱子&#xff0c;蓝色的是雨水&#xff0c;我们先来观察一下雨水的分布情况: 雨水落在凹槽之间&#xff0c;在一个凹槽的…

使用js写一个登录验证码效果

面试题 登录页面获取验证码的功能&#xff0c;用户点击获取验证码按钮(id”btn1”)&#xff0c;按文字变为“(N)后获取验证码”&#xff0c;N为倒计对秒数&#xff0c;从 60 开始&#xff0c;每秒减一&#xff0c;减到 0的时候&#xff0c;按钮文字变为“获取验证码”&#xff…

Beans模块之工厂模块Aware

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

【JavaWeb】

Javaweb 数据库相关概念MySQL数据库MySQL数据模型SQLDDL--操作数据库图形化客户端工具DML--操作数据DQL数据库约束 数据库设计多表查询事务 数据库相关概念 数据库 存储数据的仓库&#xff0c;数据是有组织的进行存储 英文&#xff1a;DataBase&#xff0c;简称DB 数据库管理系…

单元测试数据库回滚问题

问题现象&#xff1a; 在进行单元测试时&#xff0c;测试执行成功&#xff0c;可是数据库中的数据没变 问题解决&#xff1a;单元测试自动回滚&#xff0c;需要加上注解Rollback(false) https://zhhll.icu/2020/javaweb/问题/1.单元测试数据问题/ 本文由 mdnice 多平台发布