【原创】Springboot 最全的注解总结,看这一篇就够了

Spring Boot常用详解

Spring Boot是一个用于创建独立的、基于Spring的应用程序的框架。它提供了许多注解,用于简化开发过程并提供各种功能。下面是一些常用的Spring Boot注解的详细介绍:

@SpringBootApplication

@SpringBootApplication是一个组合注解,用于标记主类,表示这是一个Spring Boot应用程序的入口点。它包含了以下三个注解的功能:

  • @Configuration:将类标记为配置类,用于定义Bean的创建和配置。
  • @EnableAutoConfiguration:启用自动配置,根据类路径上的依赖自动配置Spring应用程序。
  • @ComponentScan:扫描指定包及其子包下的组件,将其注册为Spring的Bean。
@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

在上面的例子中,@SpringBootApplication注解标记了MyApp类,表示这是一个Spring Boot应用程序的入口点。main方法使用SpringApplication.run()方法启动应用程序。

@ComponentScan

@ComponentScan用于扫描并注册带有特定注解的组件。

@ComponentScan("com.example.demo")
public class AppConfig {
    // 配置逻辑
}

在上面的例子中,@ComponentScan注解标记了AppConfig类,表示扫描并注册com.example.demo包及其子包中带有@Component、`

@RestController

@RestController是一个组合注解,用于标记控制器类,表示这是一个RESTful风格的控制器。它将类中的所有方法的返回值默认为JSON格式。

@RestController
public class MyController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

在上面的例子中,@RestController注解标记了MyController类,表示这是一个RESTful风格的控制器。@GetMapping注解标记了hello()方法,表示该方法处理HTTP GET请求,并返回字符串"Hello, World!"。

@RequestMapping

@RequestMapping用于映射HTTP请求到控制器方法。可以用于类级别和方法级别。
@RequestMapping 是 Spring MVC 中非常重要的注解,它用于将 HTTP 请求映射到特定的处理方法。这个注解有多个属性,以下是其中一些常用的属性:

  1. value:指定 URL 映射的路径。你可以指定一个字符串或者一个字符串数组。例如:@RequestMapping(value = "/example")@RequestMapping(value = {"/example1", "/example2"})
  2. method:指定请求方法。你可以指定 GET、POST、PUT、DELETE 等。例如:@RequestMapping(method = RequestMethod.GET)
  3. params:指定请求参数。你可以指定查询参数或者表单参数。例如:@RequestMapping(params = "id") 表示请求应该包含一个名为 "id" 的查询参数。
  4. headers:指定请求头。例如:@RequestMapping(headers = "content-type=application/json") 表示请求的内容类型应该是 "application/json"。
  5. consumes:指定请求的媒体类型。例如:@RequestMapping(consumes = "application/json") 表示请求的内容类型应该是 "application/json"。
  6. produces:指定响应的媒体类型。例如:@RequestMapping(produces = "application/json") 表示响应的内容类型应该是 "application/json"。

这些属性可以单独使用,也可以组合在一起使用,根据实际需求进行配置。
下面是一个示例代码:

@RestController
@RequestMapping("/api")
public class MyController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

在上面的例子中,@RequestMapping注解标记了MyController类,表示该类中的所有方法都映射到"/api"路径下。@GetMapping注解标记了hello()方法,表示该方法处理HTTP GET请求,并返回字符串"Hello, World!"。

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping

这些注解用于映射HTTP GET、POST、PUT、DELETE请求到控制器方法。

@RestController
@RequestMapping("/api")
public class MyController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }

    @PostMapping("/user")
    public User createUser(@RequestBody User user) {
        // 创建用户逻辑
    }
}

在上面的例子中,@GetMapping注解标记了hello()方法,表示该方法处理HTTP GET请求,并返回字符串"Hello, World!"。@PostMapping注解标记了createUser()方法,表示该方法处理HTTP POST请求,并接收一个User对象作为请求体。

@RequestParam 是 Spring MVC 中用于映射 HTTP 请求参数的注解。它通常用于处理 GET、POST、PUT、DELETE 等请求中的参数。通过在处理方法参数上添加 @RequestParam 注解,可以将请求中的参数映射到方法的参数上。

下面是 @RequestParam 注解的详细用法:

  1. 用于 GET 请求:
@GetMapping("/example")
public String getExample(@RequestParam("id") String id) {
    // 处理逻辑
}

在上面的示例中,@RequestParam("id") 表示请求应该包含一个名为 "id" 的查询参数,并将其映射到方法的 id 参数上。如果请求中没有 "id" 参数,则该方法将返回 HTTP 400 错误。

  1. 用于 POST 请求:
@PostMapping("/example")
public String postExample(@RequestParam("name") String name, @RequestParam("age") int age) {
    // 处理逻辑
}

在上面的示例中,@RequestParam("name")@RequestParam("age") 表示请求应该包含名为 "name" 和 "age" 的表单参数,并将其分别映射到方法的 nameage 参数上。如果请求中缺少这些参数,则该方法将返回 HTTP 400 错误。

  1. 用于处理多个参数:
@GetMapping("/example")
public String getExample(@RequestParam("id") String id, @RequestParam("name") String name) {
    // 处理逻辑
}

在上面的示例中,使用 @RequestParam 注解处理多个参数。请求应该包含名为 "id" 和 "name" 的查询参数,并将其分别映射到方法的 idname 参数上。如果请求中缺少这些参数,则该方法将返回 HTTP 400 错误。

  1. 设置默认值:
@GetMapping("/example")
public String getExample(@RequestParam(value = "id", defaultValue = "0") int id) {
    // 处理逻辑
}

在上面的示例中,使用 defaultValue 属性设置默认值。如果请求中没有 "id" 参数,则该方法的 id 参数将默认为 "0"。

  1. 设置 required 属性:
@GetMapping("/example")
public String getExample(@RequestParam(value = "id", required = false) String id) {
    // 处理逻辑
}

在上面的示例中,使用 required 属性设置参数是否必需。将 required 设置为 false 表示该参数是可选的。如果请求中没有该参数,则该方法可以正常执行。

@Autowired

@Autowired用于自动装配依赖对象。

@Service
public class UserService {
    private UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

在上面的例子中,@Autowired注解标记了UserService类的构造方法,表示自动装配UserRepository对象。Spring会自动查找UserRepository的实例并注入到UserService中。

@Service、@Repository、@Component

这些注解用于标记服务类、数据访问类和通用组件类。

@Service
public class UserService {
    // 服务类逻辑
}

@Repository
public class UserRepository {
    // 数据访问逻辑
}

@Component
public class MyComponent {
    // 通用组件逻辑
}

在上面的例子中,@Service注解标记了UserService类,表示这是一个服务类。@Repository注解标记了UserRepository类,表示这是一个数据访问类。@Component注解标记了MyComponent类,表示这是一个通用组件类。

@Configuration

@Configuration用于标记配置类,表示这是一个Spring配置类。

@Configuration
public class MyConfig {
    // 配置逻辑
}

在上面的例子中,@Configuration注解标记了MyConfig类,表示这是一个Spring配置类。可以在该类中定义Bean的创建和配置。

@Import

@Import用于导入其他配置类。

@Configuration
@Import(MyConfig.class)
public class AppConfig {
    // 配置逻辑
}

在上面的例子中,@Import注解标记了AppConfig类,表示导入了MyConfig配置类。这样,AppConfig类就可以使用MyConfig中定义的Bean。

@ImportResource

@ImportResource用于导入XML配置文件。

@Configuration
@ImportResource("classpath:applicationContext.xml")
public class AppConfig {
    // 配置逻辑
}

在上面的例子中,@ImportResource注解标记了AppConfig类,表示导入了applicationContext.xml配置文件。这样,AppConfig类就可以使用applicationContext.xml中定义的Bean。

@Value

@Value用于注入属性值。

@Component
public class MyComponent {
    @Value("${my.property}")
    private String myProperty;

    // 其他逻辑
}

在上面的例子中,@Value注解标记了myProperty字段,表示注入了名为my.property的属性值。可以通过${my.property}的方式在配置文件中定义该属性的值。

@Inject

@Inject是JSR-330规范中的注解,与@Autowired功能相似,用于自动装配依赖对象。

@Service
public class UserService {
    private UserRepository userRepository;

    @Inject
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

在上面的例子中,@Inject注解标记了UserService类的构造方法,表示自动装配UserRepository对象。与@Autowired相比,@Inject是JSR-330规范中的注解,更加通用。

@Qualifier

@Qualifier用于指定注入的Bean的名称。

@Service
public class UserService {
    @Autowired
    @Qualifier("userRepository")
    private UserRepository userRepository;

    // 其他逻辑
}

在上面的例子中,@Qualifier注解标记了userRepository字段,表示注入名为userRepository的Bean。当存在多个类型相同的Bean时,可以使用@Qualifier注解指定要注入的Bean的名称。

@Resource

@Resource是JSR-250规范中的注解,与@Autowired功能相似,用于自动装配依赖对象。

@Service
public class UserService {
    @Resource
    private UserRepository userRepository;

    // 其他逻辑
}

在上面的例子中,@Resource注解标记了userRepository字段,表示自动装配UserRepository对象。与@Autowired相比,@Resource是JSR-250规范中的注解,更加通用。

@ControllerAdvice 和 @ExceptionHandler

@ControllerAdvice@ExceptionHandler 是 Spring MVC 中用于全局处理异常和自定义全局异常处理的注解。

@ControllerAdvice

@ControllerAdvice 注解可以用于定义全局的控制器类,它提供了一个统一的方法来处理所有控制器的异常。通常,我们会在这个类中定义一些通用的方法来处理所有控制器的异常。

例如:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        // 处理异常逻辑
        return new ResponseEntity<>("发生异常: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

在上面的例子中,我们使用 @ControllerAdvice 注解定义了一个全局的控制器类 GlobalExceptionHandler,然后使用 @ExceptionHandler 注解来处理所有控制器抛出的异常。如果发生异常,该方法会被调用,并返回一个状态为 INTERNAL_SERVER_ERROR 的 HTTP 响应。

@ExceptionHandler

@ExceptionHandler 注解用于在特定的控制器类或方法中处理异常。当控制器方法抛出异常时,Spring MVC 会自动调用被 @ExceptionHandler 注解的方法来处理异常。

例如:

@RestController
public class MyController {

    @GetMapping("/hello")
    public String sayHello() {
        throw new RuntimeException("自定义异常");
    }

    @ExceptionHandler(value = RuntimeException.class)
    public ResponseEntity<String> handleRuntimeException(RuntimeException e) {
        // 处理异常逻辑
        return new ResponseEntity<>("发生自定义异常: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

在上面的例子中,我们在 MyController 类中定义了一个抛出 RuntimeException 的方法 sayHello(),然后在同一个类中使用 @ExceptionHandler 注解来处理 RuntimeException 类型的异常。如果 sayHello() 方法抛出了 RuntimeException,该方法会被调用,并返回一个状态为 INTERNAL_SERVER_ERROR 的 HTTP 响应。

lombok 相关注解

@Data:

  • 作用:@Data注解是Lombok库提供的注解,它用于自动生成类的Getter、Setter、equals()hashCode()toString()方法,以减少样板代码。

  • 示例代码:

    import lombok.Data;
    
    @Data
    public class Person {
       private String name;
       private int age;
    }
  • 实例化和使用示例:

    public class Main {
       public static void main(String[] args) {
           Person person = new Person();
           person.setName("Alice");
           person.setAge(30);
    
           System.out.println("Name: " + person.getName());
           System.out.println("Age: " + person.getAge());
       }
    }

@Setter@Getter:

  • 作用:@Setter@Getter注解分别用于生成类的Setter和Getter方法,用于简化属性的访问和设置。

  • 示例代码:

    import lombok.Getter;
    import lombok.Setter;
    
    public class Car {
       @Getter @Setter
       private String make;
       @Getter @Setter
       private String model;
    }
  • 实例化和使用示例:

    public class Main {
       public static void main(String[] args) {
           Car car = new Car();
           car.setMake("Toyota");
           car.setModel("Camry");
    
           System.out.println("Make: " + car.getMake());
           System.out.println("Model: " + car.getModel());
       }
    }

@Log4j2:

  • 作用:@Log4j2是Lombok库的注解,用于自动生成Log4j2的日志记录器字段,方便日志记录。

  • 示例代码:

    import lombok.extern.log4j.Log4j2;
    
    @Log4j2
    public class LoggerExample {
       public void logMessage() {
           log.debug("Debug message");
           log.info("Info message");
           log.error("Error message");
       }
    }
  • 实例化和使用示例:

    public class Main {
       public static void main(String[] args) {
           LoggerExample loggerExample = new LoggerExample();
           loggerExample.logMessage();
       }
    }

@NoArgsConstructor, @RequiredArgsConstructor@AllArgsConstructor:

  • 作用:这些注解用于生成类的构造方法,包括无参构造方法、包含必填参数的构造方法和包含所有字段的构造方法。

  • 示例代码:

    import lombok.AllArgsConstructor;
    import lombok.NoArgsConstructor;
    import lombok.RequiredArgsConstructor;
    
    @NoArgsConstructor
    public class Person {
       private String name;
       private int age;
    }
    
    @RequiredArgsConstructor
    public class Book {
       private final String title;
       private final String author;
    }
    
    @AllArgsConstructor
    public class Product {
       private String name;
       private double price;
    }
  • 实例化和使用示例:

    public class Main {
       public static void main(String[] args) {
           Person person1 = new Person();  // 使用无参构造方法
           Book book = new Book("The Catcher in the Rye", "J.D. Salinger");  // 使用包含必填参数的构造方法
           Product product = new Product("Laptop", 999.99);  // 使用包含所有字段的构造方法
       }
    }

这些Lombok注解可以显著简化Java类的编写,减少样板代码,提高代码的可读性和可维护性。要使用这些注解,需要在项目中添加Lombok库的依赖并在IDE中启用相应的Lombok插件或功能。