Spring Boot 开发离不开这些注解,快来学习啦!

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: Spring Boot 是一款非常流行的 Java 框架,其注解用法复杂而丰富。 在介绍 Spring Boot 的注解之前,我们需要先了解 Spring 框架中的 AOP(面向切面编程)概念。

Spring Boot 是一款非常流行的 Java 框架,其注解用法复杂而丰富。 在介绍 Spring Boot 的注解之前,我们需要先了解 Spring 框架中的 AOP(面向切面编程)概念。 Spring 的 AOP 可以帮助开发者实现一些非业务功能的代码,如日志记录、性能监控等。这些功能可以通过定义一个 Aspect(切面) 类来实现。
在 Spring Boot 中,除了常规的 AOP 注解外,还有以下几类注解,这也是我看到一个脑图后的一点点收获,想要自己也能够总结总结所用到的注解,常记定能有所感悟。

核心注解
原型注解
SpringBoot注解
SpringCloud注解
缓存注解
测试注解
数据库访问注解
JPA注解
SpringMVC跟REST注解
全局异常处理注解

接下来我们将分别介绍这几类注解及其使用方法。
一、核心注解
@Configuration
@Configuration 注解可以被用来标记一个类,表示这个类是一个 Bean 配置类。在配置类中,我们可以使用其他 Bean 的定义和依赖,甚至可以使用 @Autowired 和 @Value 注解将其他 Bean 注入到当前的 Bean 中。下面是一个简单的例子:
java复制代码@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}

@Autowired
@Autowired 注解可以将一个 Bean 自动注入到当前类中。默认情况下,@Autowired 的匹配规则是根据类型进行匹配。如果有多个类型相同的 Bean,可以使用 @Qualifier 进行限定。
java复制代码@Component
public class MyController {
private final MyService myService;

@Autowired
public MyController(MyService myService) {
    this.myService = myService;
}

}

@Value
@Value 注解用于从配置文件或环境变量中获取值,可以注入 String、int、long、double、boolean 等类型。使用 ${} 可以引用配置文件中的属性,使用 $() 可以引用系统环境变量。
例如:
java复制代码@Component
public class MyComponent {
@Value("${my.config.property}")
private String configProperty;

@Value("$MY_ENV_VAR")
private String envVar;

}

@Bean
@Bean 注解用于定义一个 Bean,将其加入到 Spring 容器中。通常在 @Configuration 类中使用。可以指定该 Bean 的名称、作用域、相关依赖等。
java复制代码@Configuration
public class AppConfig {
@Bean(name = "myService", scope = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public MyService myService() {
return new MyServiceImpl();
}
}

@ComponentScan
@ComponentScan 注解用于扫描包中的组件(包括 Bean、Controller 等),将这些组件加入到 Spring 容器中。
java复制代码@Configuration
@ComponentScan(basePackages = { "com.example" })
public class AppConfig {
}

@EnableAutoConfiguration
@EnableAutoConfiguration 注解可以自动配置 Spring Boot 应用程序。在启用该注解时,Spring Boot 将根据类路径和配置文件中的信息来尝试猜测并配置应用程序。
java复制代码@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}

二、原型注解
@Scope
@Scope 注解用于设置 Bean 的作用域,包括 Singleton、Prototype、Request、Session 等。默认情况下,Bean 是 Singleton 的。
java复制代码@Configuration
public class AppConfig {
@Bean(name = "myService")
@Scope( ConfigurableBeanFactory.SCOPE_PROTOTYPE )
public MyService myService() {
return new MyServiceImpl();
}
}

@Lazy
@Lazy 注解用于标记一个 Bean 延迟初始化。当容器从 XML 文件、Java 配置类或其他方式加载时,不会创建这个 Bean。
java复制代码@Configuration
public class AppConfig {
@Bean(name = "myService")
@Lazy
public MyService myService() {
return new MyServiceImpl();
}
}

@DependsOn
@DependsOn 注解用于标识 Bean 之间的依赖关系。在容器启动时,先创建 @DependsOn 注解中指定的 Bean,再创建当前 Bean。
java复制代码@Configuration
public class AppConfig {
@Bean(name = "myService")
public MyService myService() {
return new MyServiceImpl();
}

@Bean(name = "myController")
@DependsOn("myService")
public MyController myController() {
    return new MyController(myService());
}

}

三、SpringBoot注解
@SpringBootApplication
@SpringBootApplication 注解是一个组合注解,等价于同时使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 注解。它用于标记主类,并告诉 Spring Boot 启动该应用程序。
java复制代码@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}

@RestController
@RestController 注解表示控制器中所有方法都返回 JSON 格式数据。它是 Spring MVC 中 @Controller 注解的扩展。下面是一个简单的例子:
java复制代码@RestController
public class MyController {
@GetMapping("/greeting")
public String greeting() {
return "Hello, world!";
}
}

@RequestMapping
@RequestMapping 注解用于映射 HTTP 请求。可以使用 value 属性指定 URL 映射,使用 method 属性指定请求方法。
java复制代码@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/greeting")
public String greeting() {
return "Hello, world!";
}
}

@GetMapping
@GetMapping 注解等同于 @RequestMapping(method = RequestMethod.GET),用于映射 HTTP GET 请求。
java复制代码@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/greeting")
public String greeting() {
return "Hello, world!";
}
}

@PostMapping
@PostMapping 注解等同于 @RequestMapping(method = RequestMethod.POST),用于映射 HTTP POST 请求。
java复制代码@RestController
@RequestMapping("/api")
public class MyController {
@PostMapping("/greeting")
public String greeting() {
return "Hello, world!";
}
}

@PutMapping
@PutMapping 注解等同于 @RequestMapping(method = RequestMethod.PUT),用于映射 HTTP PUT 请求。
java复制代码@RestController
@RequestMapping("/api")
public class MyController {
@PutMapping("/greeting")
public String greeting() {
return "Hello, world!";
}
}

@DeleteMapping
@DeleteMapping 注解等同于 @RequestMapping(method = RequestMethod.DELETE),用于映射 HTTP DELETE 请求。
java复制代码@RestController
@RequestMapping("/api")
public class MyController {
@DeleteMapping("/greeting")
public String greeting() {
return "Hello, world!";
}
}

@RequestParam
@RequestParam 注解用于将请求参数映射到方法的参数中。可以使用 value 属性指定参数名,使用 required 属性指定是否必填,使用 defaultValue 属性指定默认值。
java复制代码@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/greeting")
public String greeting(@RequestParam("name") String name) {
return "Hello, " + name + "!";
}
}

@PathVariable
@PathVariable 注解用于将 URL 中的占位符映射到方法的参数中。可以使用 value 属性指定占位符名称。
java复制代码@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/{name}")
public String greeting(@PathVariable("name") String name) {
return "Hello, " + name + "!";
}
}

@RequestBody
@RequestBody 注解用于从请求体中获取数据。通常用于处理 POST、PUT 请求。
java复制代码@RestController
@RequestMapping("/api")
public class MyController {
@PostMapping("/greeting")
public String greeting(@RequestBody GreetingRequest request) {
return "Hello, " + request.getName() + "!";
}
}

public class GreetingRequest {
private String name;

// getters and setters

}

@ResponseBody
@ResponseBody 注解表示该方法返回的结果直接输出到响应体中。
java复制代码@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/greeting")
@ResponseBody
public String greeting() {
return "Hello, world!";
}
}

@ResponseStatus
@ResponseStatus 注解用于指定请求处理完成后的状态码。
java复制代码@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/greeting")
@ResponseStatus(HttpStatus.OK)
public String greeting() {
return "Hello, world!";
}
}

@ExceptionHandler
@ExceptionHandler 注解用于处理请求抛出的异常。
java复制代码@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResult handleIllegalArgumentException(IllegalArgumentException ex) {
return new ErrorResult(ex.getMessage());
}
}

public class ErrorResult {
private String message;

public ErrorResult(String message) {
    this.message = message;
}

// getters and setters

}

四、SpringCloud注解
@EnableDiscoveryClient
@EnableDiscoveryClient 注解用于启用服务发现功能。使用该注解后,应用程序能够将自己注册到 Eureka 服务器,并从中获取其他实例的信息。
java复制代码@SpringBootApplication
@EnableDiscoveryClient
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}

@LoadBalanced
@LoadBalanced 注解用于标记 RestTemplate Bean,以启用负载均衡功能。在使用 REST 请求时,RestTemplate 将根据服务名自动选择一个可用的实例。
java复制代码@Configuration
public class AppConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

@FeignClient
@FeignClient 注解用于定义一个 Feign 客户端。Feign 是一款用于简化 HTTP API 客户端的工具,它支持声明式 REST 客户端。使用 @FeignClient 注解后,我们可以通过接口来调用具有相同功能的微服务。
java复制代码@FeignClient(name = "my-service")
public interface MyServiceClient {
@GetMapping("/greeting")
String greeting();
}

五、缓存注解
@Cacheable
@Cacheable 注解表示方法的结果应该被缓存起来,下次调用该方法时,如果参数和之前相同,则返回缓存结果。
java复制代码@Service
public class MyService {
@Cacheable("greetingCache")
public String greeting(String name) {
return "Hello, " + name + "!";
}
}

@CachePut
@CachePut 注解表示方法的结果应该被缓存起来,下次调用该方法时,不会返回缓存结果,而是重新计算结果并缓存起来。
java复制代码@Service
public class MyService {
@CachePut("greetingCache")
public String greeting(String name) {
return "Hello, " + name + "!";
}
}

@CacheEvict
@CacheEvict 注解表示方法执行后从缓存中删除指定项。
java复制代码@Service
public class MyService {
@CacheEvict("greetingCache")
public void clearGreetingCache() {
}
}

六、测试注解
@SpringBootTest
@SpringBootTest 注解用于测试 Spring Boot 应用程序。它会创建一个完整的 Spring 应用程序上下文,并在测试期间使用它。
java复制代码@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class MyControllerTest {
@Autowired
private TestRestTemplate restTemplate;

@Test
public void testGreeting() {
    ResponseEntity<String> responseEntity = restTemplate.getForEntity("/api/greeting", String.class);
    assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
    assertThat(responseEntity.getBody()).isEqualTo("Hello, world!");
}

}

@MockBean
@MockBean 注解用于模拟一个 Bean 的实现。在测试过程中,可以使用 Mockito.when() 等方法来指定一些行为。
java复制代码@SpringBootTest
public class MyServiceTest {
@Autowired
private MyService myService;

@MockBean
private MyRepository myRepository;

@Test
public void testFindById() {
    Mockito.when(myRepository.findById(1L)).thenReturn(Optional.of(new MyEntity()));
    MyEntity entity = myService.findById(1L);
    assertThat(entity).isNotNull();
    Mockito.verify(myRepository).findById(1L);
}

}

七、数据库访问注解
@Transactional
@Transactional 注解用于指定一个方法需要在事务中执行。默认情况下,只有 RuntimeException 会触发事务回滚。
java复制代码@Service
public class MyService {
@Autowired
private MyRepository myRepository;

@Transactional
public void save(MyEntity entity) {
    myRepository.save(entity);
}

}

@Repository
@Repository 注解用于标记数据访问层,表示这个类是一个数据仓库。
java复制代码@Repository
public interface MyRepository extends JpaRepository {
}

@Entity
@Entity 注解用于标记实体类,表示这个类是一个 JPA 实体。它与数据库中的表相对应。
java复制代码@Entity
@Table(name = "my_entity")
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

// getters and setters

}

@Id
@Id 注解用于标记主键字段。
java复制代码@Entity
@Table(name = "my_entity")
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

// getters and setters

}

@GeneratedValue
@GeneratedValue 注解用于指定主键的生成策略。
java复制代码@Entity
@Table(name = "my_entity")
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

// getters and setters

}

@Column
@Column 注解用于指定实体属性与数据库表列之间的映射关系。
java复制代码@Entity
@Table(name = "my_entity")
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "name")
private String name;

// getters and setters

}

八、JPA注解
@EnableJpaRepositories
@EnableJpaRepositories 注解用于启用 Spring Data JPA 功能。它会自动配置 Spring Data JPA 相关的 Bean。
java复制代码@SpringBootApplication
@EnableJpaRepositories
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}

@Query
@Query 注解用于自定义查询语句。
java复制代码@Repository
public interface MyRepository extends JpaRepository {
@Query("select e from MyEntity e where e.name = :name")
List findByName(@Param("name") String name);
}

九、全局异常处理注解
@ControllerAdvice
@ControllerAdvice 注解用于定义一个全局异常处理类,用于捕获所有控制器中抛出的异常,进行统一处理。
java复制代码@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ModelAndView handleException(HttpServletRequest request, Exception ex) {
ModelAndView mav = new ModelAndView();
mav.addObject("exception", ex);
mav.addObject("url", request.getRequestURI());
mav.setViewName("error");
return mav;
}
}

以上是 Spring Boot 中常见的注解和使用方法,终于干完了,虽然相关注解还有很多,以后一点一点充实这篇文章吧。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
25天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
165 73
|
20天前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
49 21
|
3天前
|
人工智能 Java API
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
本次分享的主题是阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手,由阿里云两位工程师分享。
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
|
12天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
25天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
25天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
4天前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
34 11
|
6天前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
114 12
|
26天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
12天前
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
39 10