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 请求映射到特定的处理方法。这个注解有多个属性,以下是其中一些常用的属性:
value
:指定 URL 映射的路径。你可以指定一个字符串或者一个字符串数组。例如:@RequestMapping(value = "/example")
或 @RequestMapping(value = {"/example1", "/example2"})
。
method
:指定请求方法。你可以指定 GET、POST、PUT、DELETE 等。例如:@RequestMapping(method = RequestMethod.GET)
。
params
:指定请求参数。你可以指定查询参数或者表单参数。例如:@RequestMapping(params = "id")
表示请求应该包含一个名为 "id" 的查询参数。
headers
:指定请求头。例如:@RequestMapping(headers = "content-type=application/json")
表示请求的内容类型应该是 "application/json"。
consumes
:指定请求的媒体类型。例如:@RequestMapping(consumes = "application/json")
表示请求的内容类型应该是 "application/json"。
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
注解的详细用法:
用于 GET 请求:
@GetMapping("/example")
public String getExample(@RequestParam("id") String id) {
// 处理逻辑
在上面的示例中,@RequestParam("id")
表示请求应该包含一个名为 "id" 的查询参数,并将其映射到方法的 id
参数上。如果请求中没有 "id" 参数,则该方法将返回 HTTP 400 错误。
用于 POST 请求:
@PostMapping("/example")
public String postExample(@RequestParam("name") String name, @RequestParam("age") int age) {
// 处理逻辑
在上面的示例中,@RequestParam("name")
和 @RequestParam("age")
表示请求应该包含名为 "name" 和 "age" 的表单参数,并将其分别映射到方法的 name
和 age
参数上。如果请求中缺少这些参数,则该方法将返回 HTTP 400 错误。
用于处理多个参数:
@GetMapping("/example")
public String getExample(@RequestParam("id") String id, @RequestParam("name") String name) {
// 处理逻辑
在上面的示例中,使用 @RequestParam
注解处理多个参数。请求应该包含名为 "id" 和 "name" 的查询参数,并将其分别映射到方法的 id
和 name
参数上。如果请求中缺少这些参数,则该方法将返回 HTTP 400 错误。
设置默认值:
@GetMapping("/example")
public String getExample(@RequestParam(value = "id", defaultValue = "0") int id) {
// 处理逻辑
在上面的示例中,使用 defaultValue
属性设置默认值。如果请求中没有 "id" 参数,则该方法的 id
参数将默认为 "0"。
设置 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插件或功能。