SpringBoot 提供了很多个注解,可以帮助我们快速构建应用程序,以下是 SpringBoot 和其它的一些常用注解。

# 注解详情表

注解名称参数类型注解简介框架
@SpringBootApplication可空用于标识 SpringBoot 应用程序的入口类SpringBoot
@RestController可空用于自动将返回值转换为 JSON 格式SpringWeb
@RequestMappingString/String[]用于映射 URL 请求SpringWeb
@GetMappingString/String[]用于映射 HTTPGET 请求SpringWeb
@PostMappingString/String[]用于映射 HTTPPOST 请求SpringWeb
@DeleteMappingString/String[]用于映射 HTTPDELETE 请求SpringWeb
@RequestParamString用于获取请求参数的值SpringWeb
@PathVariable可空用于获取 URL 中的参数值SpringWeb
@RequestBody可空用于将 HTTP 请求的主体转换为方法的参数SpringWeb
@ResponseBody用于将方法的返回值转换为 HTTP 响应的主体SpringWeb
@Autowired用于自动装配 Spring 容器中的 Bean 对象Spring
@Component可空用于标识一个类是 Spring 容器中的组件Spring
@Service可空用于标识一个类是 Spring 容器中的服务组件Spring
@Repository可空用于标识一个类是 Spring 容器中的数据访问组件Spring
@Configuration可空用于标识一个类是 Spring 的配置类Spring
@ValueString用于获取配置文件中的属性值Spring
@Bean可空用于将一个方法返回的对象注册到 Spring 容器中Spring
@ImportClass<?>/Class<?>[]用于导入其他配置类或 BeanSpring
@ConditionalClass<? extends Condition>/Class<? extends Condition>[]用于根据条件判断是否创建 Bean 或执行配置Spring
@ProfileString/String[]用于指定配置的环境Spring
@PropertySourceString/String[]用于指定配置文件的位置Spring
@QualifierString用于指定注入的 Bean 的名称Spring
@ExceptionHandlerClass<? extends Throwable>/Class<? extends Throwable>[]用于处理异常SpringWeb
@ResponseStatusHttpStatus用于指定异常的 HTTP 响应状态码SpringWeb
@ControllerAdvice可空用于全局处理异常SpringWeb
@CrossOriginString/String[]用于解决跨域问题SpringWeb
@Async可空用于将方法标记为异步执行Spring
@CacheableString/String[]用于缓存方法的返回值Spring
@CacheEvictString/String[]用于清除缓存Spring
@CachePutString/String[]用于更新缓存中的数据Spring
@Transactional可空用于标识一个方法或类需要使用事务进行操作Spring
@EnableTransactionManagement可空此注解用于启用事物管理功能Spring
@EnableAspectJAutoProxy可空用于启用 AOP 功能Spring
@Aspect可空用于定义切面SpringAop
@PointcutString用于定义切点SpringAop
@BeforeString用于在方法执行前执行通知SpringAop
@AfterString用于在方法执行后执行通知SpringAop
@AroundString用于在方法执行前后执行通知SpringAop
@AfterReturningString用于在方法返回结果后执行通知SpringAop
@AfterThrowingString用于在方法抛出异常后执行通知SpringAop
@Orderint用于指定切面的执行顺序Spring
@Slf4j可空用于简化日志记录Lombok
@Data可空用于自动生成 JavaBeangetsettoStringhashCodeequals 方法Lombok
@NoArgsConstructor可空用于生成无参构造函数Lombok
@AllArgsConstructor可空用于生成全参构造函数Lombok
@Builder可空用于生成 Builder 模式的构造函数Lombok
@EqualsAndHashCode可空用于生成 hashCodeequals 方法Lombok
@ToString可空用于生成 toString 方法Lombok
@Getter可空用于生成 get 方法Lombok
@Setter可空用于生成 set 方法Lombok

# @SpringBootApplication

  • 这是一个组合注解,其中包括了 @Configuration@EnableAutoConfiguration@ComponentScan 这三个注解,用于标识在 SpringBoot 应用程序的入口类。
  • @Configuration :表示这个类是一个配置类,它定义了一个或多个 @Bean 方法,用于创建和配置 Spring 应用程序上线文中的 Bean
  • @EnableAutoConfiguration :表示启用 SpringBoot 的自动配置机制,它会自动添加所需要的依赖和配置,以使应用程序能够运行。
  • @ComponentScan :表示 SpringBoot 扫描当前包及其子包中的所有 @Component@Service@Repository@Controller 的注解类并将它们注册为 Spring 所需要的 Bean
  • SpringBootApplication :这个注解通常用于在 SpringBoot 的应用程序入口类上,用于启动 SpringBoot 应用程序,它是简化 Spring 应用程序的配置和启动过程。
Springboot3DemoApplication.java
package top.rem.rain.springboot3demo;
import org.springframework.boot.SpringApplication;
@SpringBootApplication
public class SpringBoot3DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBoot3DemoApplication.class, args);
    }
}

# @RestController

  • @RestController@Controller 注解类似,但是 @RestController 会自动将返回值转换为 JSON 格式。
  • @RestControllerSpringFramework 4.0 版本引入的一个注解,它是 @Controller@ResponseBody 注解的组合。
  • 它用于标注一个类,表示这个类是一个 RESTful 风格的控制器,可以处理 HTTP 请求并返回 JSON/XML 格式的响应。
  • @RestController 用于代替原来的 @Controller 注解,它默认情况下会将控制器方法的返回值转换为 JSON 格式,并以 HTTP 响应的方式返回给客户端。
  • 如果需要返回 XML 格式的响应,可以使用其它注解如: @Produces@Consumes 注解。
HelloController.java
package top.rem.rain.springboot3demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

# @RequestMapping

此注解用于映射请求 URL 和处理方法,它是 SpringMVC 框架中的一个核心注解,它用于映射 HTTP 请求和控制器方法之间的关系,它可以用于类级别和方法级别,用于指定请求 URLHTTP 方法如: GETPOSTPUTDELETE 等。

UserController.java
package top.rem.rain.springboot3demo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class UserController {
    
    @GetMapping("/users")
    public List<User> getUsers() {
        // 获取用户列表
    }
    @PostMapping("/users")
    public void createUser(@RequestBody User user) {
        // 创建新用户
    }
    @GetMapping("/users/{id}")
    public User getUserById(@PathVariable Long id) {
        // 根据 ID 获取用户信息
    }
    @PutMapping("/users/{id}")
    public void updateUser(@PathVariable Long id, @RequestBody User user) {
        // 更新用户信息
    }
    @DeleteMapping("/users/{id}")
    public void deleteUser(@PathVariable Long id) {
        // 根据 ID 删除用户
    }
}

# @GetMapping

此注解用于映射 HTTPGET 请求。

UserController.java
package top.rem.rain.springboot3demo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class UserController {
    
    @GetMapping("/users")
    public List<User> getUsers() {
        // 获取用户列表
    }
    @GetMapping("/users/{id}")
    public User getUserById(@PathVariable Long id) {
        // 根据 ID 获取用户信息
    }
}

# @PostMapping

此注解用于映射 HTTPPOST 请求。

UserController.java
package top.rem.rain.springboot3demo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class UserController {
    
    @PostMapping("/users")
    public void createUser(@RequestBody User user) {
        // 创建新用户
    }
}

# @PutMapping

此注解用于映射 HTTPPUT 请求。

UserController.java
package top.rem.rain.springboot3demo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class UserController {
    
    @PutMapping("/users/{id}")
    public void updateUser(@PathVariable Long id, @RequestBody User user) {
        // 更新用户信息
    }
}

# @DeleteMapping

此注解用于映射 HTTPDELETE 请求。

UserController.java
package top.rem.rain.springboot3demo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class UserController {
    
    @DeleteMapping("/users/{id}")
    public void deleteUser(@PathVariable Long id) {
        // 根据 ID 删除用户
    }
}

# @RequestParam

此注解用于获取请求参数的值。

UserController.java
package top.rem.rain.springboot3demo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class UserController {
    @GetMapping("/users")
    public List<User> getUsers(@RequestParam("page") int page, @RequestParam("size") int size) {
        // 分页获取用户列表
    }
}

# @PathVariable

此注解用于获取 URL 中的参数值,它是 SpringMVC 框架中的一个注解,用于将 HTTP 请求路径中的变量绑定到控制器方法的参数上。

UserController.java
package top.rem.rain.springboot3demo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class UserController {
   
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        // 根据 ID 获取用户信息
    }
}

# @RequestBody

此注解用于将 HTTP 请求的主体转换为方法的参数,它是 SpringMVC 框架中的一个注解,用于将 HTTP 请求体中的数据绑定到控制器方法的参数上。

UserController.java
package top.rem.rain.springboot3demo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class UserController {
    
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // 创建用户
    }
}

# @ResponseBody

此注解用于将方法的返回值转换为 HTTP 响应的主体, @ResponseBodySpring MVC 框架中的一个注解,用于将控制器方法的返回值转换为 HTTP 响应体中的数据。

UserController.java
@RestController
public class UserController {
    @GetMapping("/users/{id}")
    @ResponseBody
    public User getUser(@PathVariable int id) {
        // 从数据库或其他地方获取用户数据
        User user = userService.getUserById(id);
        return user;
    }
}

# @Autowired

此注解用于自动装配 Spring 容器中的 Bean

如果不推荐使用 @Autowired 注解也可以使用 jakarta@Resource 注解代替 @Autowired 进行资源的注入。

UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;
    // 实现 UserService 接口中的方法
}

# @Component

此注解用于标识一个类是 Spring 容器中的组件, @ComponentSpring 框架中的一个通用注解,用于标注一个类作为 Spring 组件中的 Bean

UserServiceImpl.java
@Component
public class UserServiceImpl implements UserService {
    // 实现 UserService 接口中的方法
    
}

# @Service

此注解用于标识一个类是 Spring 容器中的服务组件, @ServiceSpring 框架中的一个注解,用于标注一个类作为服务类 ( Service )。

UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
    // 实现 UserService 接口中的方法
    
}

# @Repository

此注解用于标识一个类是 Spring 容器中的数据访问组件, @RepositorySpring 框架中的一个注解,用于标注一个类作为数据访问对象 ( DAO )。

UserRepositoryImpl.java
@Repository
public class UserRepositoryImpl implements UserRepository {
    // 实现 UserRepository 接口中的方法
    
}

# @Configuration

此注解用于标识一个类是 Spring 的配置类, @ConfigurationSpring 框架中的一个注解,用于标注一个类作为配置类。

AppConfig.java
@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }
    @Bean
    public UserRepository userRepository() {
        return new UserRepositoryImpl();
    }
}

# @Value

此注解用于获取配置文件中的属性值, @ValueSpring 框架中的一个注解,用于将配置文件中的属性值注入到 Bean 对象中。

MyComponent.java
/**
 * 这个类使用 @Component 注解标注,表示这个类是一个 Spring Bean,可以被其他的 Spring Bean 自动装配。
 * 在属性级别上,@Value 注解指定了需要注入的属性值,这个属性值可以通过 ${...} 的方式引用配置文件中的属性值。
 * 在这个例子中,MyComponent 类中的 myProperty 属性使用 @Value 注解指定了需要注入的属性值,Spring 会自动将配置文件中名为 my.property 的属性值注入到这个属性中。
 * @Value 注解用于注入配置文件中的属性值,使得开发者可以方便地从配置文件中获取属性值,并将其注入到 Bean 对象中。同时,使用 @Value 注解还可以方便地处理不同环境下的配置文件,如开发环境和生产环境的配置文件。
 * Value 注解是 Spring 框架中比较常用的注解之一,可以让开发者更加专注于业务逻辑的实现,而不必关心属性值的获取和注入细节。
 */
@Component
public class MyComponent {
    @Value("${my.property}")
    private String myProperty;
    // 其他方法
}

# @Bean

此注解用于将一个方法返回的对象注册到 Spring 容器中, @BeanSpring 框架中的一个注解,用于将一个方法返回的对象注册为一个 Spring Bean

AppConfig.java
@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }
    @Bean
    public UserRepository userRepository() {
        return new UserRepositoryImpl();
    }
}

# @Import

此注解用于导入其它配置类或 Bean

AppConfig.java
@Configuration
@Import({AppConfig1.class, AppConfig2.class})
public class AppConfig {
    // 其他方法
}

# @Conditional

此注解用于根据条件判断是否创建 Bean 或执行配置。

AppConfig.java
@Configuration
public class AppConfig {
    @Bean
    @Conditional(DatabaseTypeCondition.class)
    public UserRepository userRepository() {
        return new UserRepositoryImpl();
    }
    // 其他方法
}

# @Profile

此注解用于指定配置的环境,如开发环境、测试环境或生产环境。

AppConfig.java
@Configuration
public class AppConfig {
    @Bean
    @Profile("dev")
    public UserService userServiceDev() {
        return new UserServiceDevImpl();
    }
    @Bean
    @Profile("prod")
    public UserService userServiceProd() {
        return new UserServiceProdImpl();
    }
    // 其他方法
}

# @PropertySource

此注解用于指定配置文件的位置, @PropertySourceSpring 框架中的一个注解,用于指定一组属性文件的位置,从而可以在 Spring 应用程序中使用这些属性。

AppConfig.java
/**
 * 这个类使用 @Configuration 注解标注,表示这个类是一个配置类,用于配置应用程序的 Bean 对象。
 * 在类级别上,使用 @PropertySource 注解可以指定一个属性文件的位置。在这个例子中,使用 @PropertySource 注解指定了一个名为 application.properties 的属性文件,它位于 classpath 下。
 * 在方法级别上,使用 @Bean 注解标注方法,表示这个方法返回一个 Bean 对象。在这个例子中,使用 Environment 对象从属性文件中读取属性值,并将这些属性值传递给 UserService 实例的构造方法。
 * @PropertySource 注解用于指定一组属性文件的位置,使得开发者可以在 Spring 应用程序中使用这些属性。同时,使用 Environment 对象可以方便地读取属性文件中的属性值,并将这些属性值传递给 Bean 对象的构造方法或属性。
 * @PropertySource 注解是 Spring 框架中比较常用的注解之一,可以让开发者更加灵活地管理和配置 Spring Bean。
 */
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
    @Autowired
    private Environment environment;
    @Bean
    public UserService userService() {
        return new UserServiceImpl(environment.getProperty("userService.name"));
    }
    // 其他方法
}

# @Qualifier

此注解用于指定注入的 Bean 的名称。

UserServiceImpl.java
@Component
public class UserServiceImpl implements UserService {
    @Autowired
    @Qualifier("userRepositoryImpl")
    private UserRepository userRepository;
    // 其他方法
}

# @ExceptionHandler

此注解用于处理异常。

GlobalExceptionHandler.java
/**
 * 这个类使用 @ControllerAdvice 注解标注,表示这个类是一个全局异常处理器。在方法级别上,使用 @ExceptionHandler 注解可以指定一个方法来处理控制器中抛出的异常。
 * 在这个例子中,使用 @ExceptionHandler 注解指定了一个名为 handleException 的方法,它处理所有类型的异常。当控制器中抛出异常时,会调用这个方法,并将异常对象作为参数传递给这个方法。
 * 在这个方法中,使用 ModelAndView 对象来封装错误信息,并将视图名称设置为 error。最后,返回这个 ModelAndView 对象,将错误信息显示到用户界面上。
 * @ExceptionHandler 注解用于处理控制器中抛出的异常,使得开发者可以根据需要灵活地处理异常。同时,使用 @ControllerAdvice 注解可以将这个异常处理器应用于所有的控制器中。
 * @ExceptionHandler 注解是 Spring 框架中比较常用的注解之一,可以让开发者更加灵活地处理控制器中的异常。
 */
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("errorMessage", ex.getMessage());
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

# @ResponseStatus

此注解用于指定异常的 HTTP 响应状态码。

UserController.java
@Controller
public class UserController {
    @GetMapping("/user/{id}")
    @ResponseBody
    @ResponseStatus(HttpStatus.OK)
    public UserDetails getUserDetails(@PathVariable("id") Long id) {
        // 查询用户信息
        UserDetails userDetails = userService.getUserDetails(id);
        if (userDetails == null) {
            throw new UserNotFoundException("User not found");
        }
        return userDetails;
    }
    @ExceptionHandler(UserNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ResponseBody
    public String handleUserNotFoundException(UserNotFoundException ex) {
        return ex.getMessage();
    }
}

# @ControllerAdvice

此注解用于处理全局异常, @ControllerAdviceSpring 框架中的一个注解,用于定义全局控制器通知。

Spring MVC 框架中,控制器通知是一些特殊的组件,它们可以在控制器方法执行前或执行后抛出异常时执行一些额外的逻辑处理,使用 @ControllerAdvice 注解可以定义全局控制器通知,它可以应用于所有的控制器。

GlobalControllerAdvice.java
/**
 * 这个类使用 @ControllerAdvice 注解标注,表示这个类是一个全局控制器通知。在方法级别上,使用 @ModelAttribute 注解标注方法,表示这个方法会在所有控制器方法执行前执行,用于将当前登录用户信息添加到模型中。
 * 使用 @InitBinder 注解标注方法,表示这个方法会在所有控制器方法执行前执行,用于注册自定义的属性编辑器。
 * 使用 @ExceptionHandler 注解标注方法,表示这个方法会在控制器中抛出异常时执行,用于处理控制器方法中抛出的异常。
 * @ControllerAdvice 注解用于定义全局控制器通知,使得开发者可以在所有控制器方法执行前、执行后或抛出异常时执行一些额外的逻辑处理。同时,使用 @ModelAttribute 注解可以将一些公共的模型数据添加到模型中,使用 @InitBinder 注解可以注册自定义的属性编辑器,使用 @ExceptionHandler 注解可以处理控制器方法中抛出的异常。
 * @ControllerAdvice 注解是 Spring 框架中比较常用的注解之一,可以让开发者更加灵活地定义全局控制器通知。
 */
@ControllerAdvice
public class GlobalControllerAdvice {
    @ModelAttribute("currentUser")
    public User getCurrentUser() {
        // 获取当前登录用户信息
        User currentUser = userService.getCurrentUser();
        return currentUser;
    }
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        // 注册自定义的属性编辑器
        binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
    }
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("errorMessage", ex.getMessage());
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

# @CrossOrigin

此注解用于解决跨域问题, @CrossOrigin 注解是 Spring 框架中的一个注解,用于解决跨域资源共享 ( CORS ) 问题。

跨越资源共享是浏览器安全策略的一部分,它限制了浏览器在不同域名之间发送和接收 HTTP 请求,使用 @CrossOrigin 注解可以指定允许跨域访问的域名和 HTTP 方法。

ApiController.java
/**
 * 这个类使用 @RestController 注解标注,表示这个类是一个 RESTful 风格的控制器。在类级别上,使用 @RequestMapping 注解指定控制器处理的请求路径为 /api。同时,使用 @CrossOrigin 注解可以指定允许跨域访问的域名和 HTTP 方法。
 * 在这个例子中,使用 @CrossOrigin 注解指定允许来自 http://localhost:8080 域名的 GET 和 POST 请求访问该控制器中的方法。这意味着,在 http://localhost:8080 域名下的网页可以通过 XMLHttpRequest 对象发送 GET 和 POST 请求,访问该控制器中的方法。
 * @CrossOrigin 注解用于解决跨域资源共享(CORS)问题,使得开发者可以更加灵活地控制允许跨域访问的域名和 HTTP 方法。它是一种简单但非常有效的解决方案,可以使得前端开发者更加轻松地开发跨域应用程序。
 * @CrossOrigin 注解是 Spring 框架中比较常用的注解之一,可以让开发者更加灵活地解决跨域资源共享(CORS)问题。
 */
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:8080", methods = {RequestMethod.GET, RequestMethod.POST})
public class ApiController {
    @GetMapping("/users")
    public List<User> getUsers() {
        // 查询用户信息
        List<User> users = userService.getUsers();
        return users;
    }
}

# @Async

此注解用于将方法标记为异步执行,在 Spring 框架中,如果有一个方法需要执行一些比较耗时的操作,此时如果这个方法是在主线程中执行,就会导致主线程被阻塞,用户界面将无法响应用户的操作。

此时就可以使用 @Async 注解来将这个方法的执行异步化,让主线程继续执行其它任务,从而提高应用程序的响应性能。

UserService.java
/**
 * 这个类使用 @Service 注解标注,表示这个类是一个服务。在方法级别上,使用 @Async 注解标注方法,表示这个方法需要异步执行。
 * 在这个例子中,getUserDetailsAsync 方法使用 @Async 注解标注,表示这个方法需要异步执行。查询用户信息的操作在异步线程中执行,不会阻塞主线程。同时,这个方法返回一个 CompletableFuture 对象,表示异步执行的结果。
 * @Async 注解用于异步执行方法,可以提高应用程序的响应性能。它是一种简单但非常有效的解决方案,可以使得开发者更加轻松地编写并发应用程序。
 * @Async 注解是 Spring 框架中比较常用的注解之一,可以让开发者更加灵活地异步执行方法。需要注意的是,异步执行的方法必须在一个独立的线程中执行,因此需要使用线程池来管理异步线程的执行。
 */
@Service
public class UserService {
    @Async
    public CompletableFuture<UserDetails> getUserDetailsAsync(Long id) {
        // 查询用户信息
        UserDetails userDetails = userRepository.getUserDetails(id);
        return CompletableFuture.completedFuture(userDetails);
    }
}

# @Cacheable

此注解用于缓存方法的返回值,在 Spring 框架中,如果一个方法的返回结果是固定的,而且这个方法的执行比较耗时,我们可以使用 @Cacheable 注解将这个方法的返回结果缓存起来,下次执行这个方法时直接从缓存中获取结果即可,避免重复执行。

UserService.java
/**
 * 这个类使用 @Service 注解标注,表示这个类是一个服务。在方法级别上,使用 @Cacheable 注解标注方法,表示这个方法返回的结果可以被缓存起来。
 * 在这个例子中,getUser 方法使用 @Cacheable 注解标注,表示这个方法的返回结果可以被缓存起来。查询用户信息的操作在第一次执行时会被执行,返回结果会被缓存到名为 "userCache" 的缓存中。下次执行 getUser 方法时,如果缓存中已经存在这个结果,就直接从缓存中获取结果,不需要再次执行查询操作。
 * @Cacheable 注解用于缓存方法的返回结果,可以提高应用程序的执行效率。它是一种简单但非常有效的解决方案,可以使得开发者更加灵活地使用缓存来优化应用程序的性能。
 * @Cacheable 注解是 Spring 框架中比较常用的注解之一,可以让开发者更加轻松地使用缓存来提高应用程序的性能。需要注意的是,使用缓存需要考虑缓存的生命周期和缓存的一致性,必要时需要使用缓存失效机制和缓存更新机制来维护缓存的一致性。
 */
@Service
public class UserService {
    @Cacheable("userCache")
    public User getUser(Long id) {
        // 查询用户信息
        User user = userRepository.getUser(id);
        return user;
    }
}

# @CacheEvict

此注解用于清除缓存, @CacheEvict 注解是 Spring 框架中的一个注解,它主要用于清空缓存中的数据,在 Spring 框架中,如果一个方法的执行会导致缓存数据的失效,我们可以使用 @CacheEvict 注解将这个方法的缓存数据清空,这样下次执行这个方法时就会重新查询数据并缓存起来。

UserService.java
/**
 * 这个类使用 @Service 注解标注,表示这个类是一个服务。在方法级别上,使用 @Cacheable 注解标注 getUser 方法,表示这个方法的返回结果可以被缓存起来。同时,使用 @CacheEvict 注解标注 clearCache 方法,表示这个方法会清空名为 "userCache" 的缓存。
 * 在这个例子中,getUser 方法使用 @Cacheable 注解标注,表示这个方法的返回结果可以被缓存起来。查询用户信息的操作在第一次执行时会被执行,返回结果会被缓存到名为 "userCache" 的缓存中。下次执行 getUser 方法时,如果缓存中已经存在这个结果,就直接从缓存中获取结果,不需要再次执行查询操作。
 * 当调用 clearCache 方法时,@CacheEvict 注解会清空名为 "userCache" 的缓存,下次执行 getUser 方法时,就需要重新查询数据并缓存起来。
 * @CacheEvict 注解用于清空缓存中的数据,可以使得开发者更加灵活地控制缓存的生命周期和缓存的一致性。它是一种简单但非常有效的解决方案,可以使得开发者更加轻松地使用缓存来提高应用程序的性能。
 * @CacheEvict 注解是 Spring 框架中比较常用的注解之一,可以让开发者更加灵活地控制缓存的生命周期和缓存的一致性。需要注意的是,清空缓存需要谨慎操作,必要时需要考虑缓存的失效机制和缓存更新机制来维护缓存的一致性。
 */
@Service
public class UserService {
    @Cacheable("userCache")
    public User getUser(Long id) {
        // 查询用户信息
        User user = userRepository.getUser(id);
        return user;
    }
    
    @CacheEvict("userCache")
    public void clearCache() {
        // 清空缓存
    }
}

# @CachePut

用于更新缓存中的数据, @CachePut 注解是 Spring 框架中的一个注解,它主要用于更新或添加缓存中的数据,在 Spring 框架中,如果一个方法的执行会导致缓存数据的关系或添加,我们可以使用 @CachePut 注解将这个方法的返回结果更新或添加到缓存中。

UserService.java
/**
 * 这个类使用 @Service 注解标注,表示这个类是一个服务。在方法级别上,使用 @Cacheable 注解标注 getUser 方法,表示这个方法的返回结果可以被缓存起来。同时,使用 @CachePut 注解标注 updateUser 方法,表示这个方法会更新或添加名为 "userCache" 的缓存。
 * 在这个例子中,getUser 方法使用 @Cacheable 注解标注,表示这个方法的返回结果可以被缓存起来。查询用户信息的操作在第一次执行时会被执行,返回结果会被缓存到名为 "userCache" 的缓存中。下次执行 getUser 方法时,如果缓存中已经存在这个结果,就直接从缓存中获取结果,不需要再次执行查询操作。
 * 当调用 updateUser 方法时,@CachePut 注解会更新或添加名为 "userCache" 的缓存,下次执行 getUser 方法时,就可以从缓存中获取更新后的用户信息。
 * @CachePut 注解用于更新或添加缓存中的数据,可以使得开发者更加灵活地控制缓存的生命周期和缓存的一致性。它是一种简单但非常有效的解决方案,可以使得开发者更加轻松地使用缓存来提高应用程序的性能。
 * @CachePut 注解是 Spring 框架中比较常用的注解之一,可以让开发者更加灵活地控制缓存的生命周期和缓存的一致性。需要注意的是,更新或添加缓存需要谨慎操作,必要时需要考虑缓存的失效机制和缓存更新机制来维护缓存的一致性。
 */
@Service
public class UserService {
    @Cacheable("userCache")
    public User getUser(Long id) {
        // 查询用户信息
        User user = userRepository.getUser(id);
        return user;
    }
    
    @CachePut("userCache")
    public User updateUser(Long id, User user) {
        // 更新用户信息
        User updatedUser = userRepository.updateUser(id, user);
        return updatedUser;
    }
}

# @Transactional

  • @TransactionalSpring 框架中的一个注解,用于标识一个方法或类需要使用事务进行操作。
  • @Transactional 注解在 Spring 框架中用于声明事务管理,它允许开发者通过简单的注解来控制事务的边界,具体来说, @Transactional 注解的作用包括以下五种特性:
    • 只读标记 :通过设置为只读,可以告诉 Spring 事务的类型,这有助于优化事务的性能。
    • 隔离级别 :定义了事务的隔离级别,用于解决并发事务中的问题,如脏读、不可重复读等,例如: ISOLATION_READ_COMMITTED 表示事务只能读取已经提交的数据。
    • 超时时间 :定义了事务的超时时间,超过这个时间,事务将自动回滚,例如: timeout = 30 表示事务最多运行 30 秒。
    • 回滚规则 :定义了哪些异常会导致事务回滚,默认情况下,只有运行时检查的异常会导致事务回滚,而受检异常不会。
    • 事务传播行为 :定义了方法调用时事务如何传播,比如是否新开一个事务,或者加入到已有的事务中,例如: PROPAGATION_REQUIRED 表示如果当前没有事务,就新建一个事务,如果已经存在事务则加入这个事务中。
  • @Transactional 注解通常用于服务层的方法上,以确保业务操作的原子性、一致性、隔离性和持久性,它是实现声明事务管理的一种便捷方式,使得事务管理变得更加简单和直观。
  • Spring 框架中,如果一个方法需要对数据库进行操作,我们可以使用 @Transactional 注解来确保这个操作在一个事务中进行,从而保证操作的原子性、一致性、隔离性和持久性。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.0.8.RELEASE</version>
</dependency>
UserService.java
/**
 * 这个类使用 @Service 注解标注,表示这个类是一个服务。同时,在类级别上使用 @Transactional 注解标注,表示这个类中的所有方法都需要使用事务进行操作。
 * 在这个例子中,createUser 和 updateUser 方法都需要对数据库进行操作,因此使用 userRepository 来保存或更新用户信息。由于这个类使用了 @Transactional 注解来标识,因此 userRepository 的操作都在一个事务中进行,从而保证操作的原子性、一致性、隔离性和持久性。
 * @Transactional 注解用于标识一个方法或类需要使用事务进行操作,可以使得开发者更加灵活地控制事务的使用。它是一种简单但非常有效的解决方案,可以使得开发者更加轻松地使用事务来提高应用程序的性能和数据一致性。
 * @Transactional 注解是 Spring 框架中比较常用的注解之一,可以让开发者更加灵活地控制事务的使用。需要注意的是,事务的使用需要谨慎操作,必要时需要考虑事务的隔离级别、超时时间和回滚机制等来维护数据的一致性和应用程序的性能。
 */
@Service
@Transactional
public class UserService {
    @Autowired
    private UserRepository userRepository;
    public void createUser(User user) {
        userRepository.save(user);
    }
    
    public void updateUser(Long id, User user) {
        User existingUser = userRepository.findById(id);
        
        if (existingUser != null) {
            existingUser.setName(user.getName());
            existingUser.setEmail(user.getEmail());
            userRepository.save(existingUser);
        }
    }
}
MyService.java
import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Service;
@Service
public class MyService {
    
    @Transactional(propagation = Propagation.REQUIRED) // 仅将事务管理应用于该方法
    public void doSomething() {
        // 方法体
    }
    
    @Transactional(isolation = Isolation.READ_COMMITTED, timeout = 30) // 对该方法应用特定的事务属性
    public void doSomethingElse() {
        // 方法体
    }
}

MyService 示例中, doSomething() 方法和 doSomethingElse() 方法分别有不同的事务属性设置, doSomething() 方法使用默认的传播行为 PROPAGATION_REQUIRED , 而 doSomethingElse() 方法指定了隔离级别为 Isolation.READ_COMMITTED 和超时时间为 30 秒。

注意:为了让 @Transactional 注解生效,需要在 Spring 配置中启用事务管理,在使用 SpringBoot 时,通常无需额外配置,因为 SpringBoot 自动配置了事务管理器。

另外当方法抛出异常时,如果异常不是运行时异常 ( RuntimeException 的子类),那么默认情况下事务不会自动回滚,如果希望某些受检异常也能触发事务回滚,需要在 @Transactional 注解中指定 rollbackFor 属性。

@Transactional(rollbackFor = MyCustomException.class)
public void someMethod() throws MyCustomException {
    //  方法体
}

# @EnableTransactionManagement

此注解用于启用事物管理功能, @EnableTransactionManagementSpring 框架中用于开启基于注解的事务管理,它主要用于告诉 Spring 容器需要创建一个事务管理器 ( PlatformTransactionManager ), 并将其注册到 Spring 上下文中,一旦事务管理器被创建并配置好,就可以通过 @Transactional 注解在服务层的方法上声明事务的边界了。

当你在某个配置类上添加了 @EnableTransactionManagement 注解后, Spring 会根据配置的事务管理器类型如: JPAJDBCHibernate 等来创建相应的事务管理实例,当应用中的方法被标注为 @Transactional 时, Spring 就能够利用配置好的事务管理器来管理事务,简而言之 @EnableTransactionManagement 注解是用于开启 Spring 声明式事务管理的关键步骤,它使得 @Transactional 注解能够正常工作。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.0.8.RELEASE</version>
</dependency>
AppConfig.java
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.jta.JtaTransactionManager;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.PlatformTransactionManager;
/**
 * @ConfigurationProperties:用于将属性文件中的值绑定到一个 Java 对象上,它可以将属性文件中的多个属性值注入到一个 Java 对象中,与 @Value 注解不同的是 @ConfigurationProperties 可以将属性文件中的值注入到多个属性中。
 */
@Configuration
@EnableTransactionManagement // 开启基于注解的事务管理
public class AppConfig {
    @Resource
    private DataSourceProperties dataSourceProperties;
    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSource dataSource() {
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        JtaTransactionManager transactionManager = new JtaTransactionManager();
        transactionManager.setTransactionManagerName("myTransactionManager");
        transactionManager.setUserTransactionName("myUserTransaction");
        return transactionManager;
    }
}

SpringBoot 应用中,由于自动配置的特性,通常不需要手动添加 @EnableTransactionManagement 注解,因为 SpringBoot 会自动配置事务管理,但是如果你需要自定义事务管理器或者需要更细力度的事务控制,就可以在配置类中添加 @EnableTransactionManagement 注解。

AppConfig 示例中, AppConfig 类被标记为配置类 (通过@Configuration注解) ,然后通过 @EnableTransactionManagement 注解来启用基于注解的事务管理,同时在这个配置类中定义了数据源和事务管理器的 bean , 其中事务管理器是通过 JtaTransactionManager 来创建的,在这个配置类或其它配置类中定义的服务组件里的方法,只要被标注为 @Transactional 注解,它们的事务行为就会被 Spring 容器管理。

# @EnableAspectJAutoProxy

此注解用于启用 AOP 功能, @EnableAspectJAutoProxySpring 框架中的一个注解,用于启用自动代理功能,以便使用 AOP(面向切面编程) 进行编程。

Spring 框架中,如果需要使用 AOP 来实现某些功能,就可以使用 @EnableAspectJAutoProxy 注解来启用自动代理功能,从而在运行时自动为我们生成代理对象,以便进行切面编程。

AppConfig.java
/**
 * 这个类使用 @Configuration 注解标注,表示这个类是一个配置类。同时,在类级别上使用 @EnableAspectJAutoProxy 注解标注,表示这个配置类需要启用自动代理功能。
 * 在这个例子中,我们定义了一个 MyAspect 类来实现某些功能的切面编程。为了让 Spring 框架能够自动为我们生成代理对象,我们需要将 MyAspect 类加入到 Spring 容器中,并且使用 @Bean 注解标注。另外,我们还定义了一个 UserService 类来实现某些业务功能。
 * @EnableAspectJAutoProxy 注解用于启用自动代理功能,可以使得开发者更加方便地使用 AOP 来实现某些功能。它是一种简单但非常有效的解决方案,可以让开发者更加轻松地使用切面编程来提高应用程序的性能和可维护性。
 * @EnableAspectJAutoProxy 注解是 Spring 框架中比较常用的注解之一,可以让开发者更加方便地使用 AOP 来实现某些功能。需要注意的是,AOP 的使用需要谨慎操作,必要时需要考虑 AOP 的切面逻辑、切入点和通知类型等来维护应用程序的性能和可维护性。
 */
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    @Bean
    public MyAspect myAspect() {
        return new MyAspect();
    }
    
    @Bean
    public UserService userService() {
        return new UserService();
    }
}

# @Aspect

此注解用于定义切面, @AspectSpring 框架中的一个注解,它用于标识一个类为切面类,从而可以在该类中定义切面逻辑以实现 AOP(面向切面编程)

Spring 框架中,如果需要使用 AOP 来实现某些功能,我们可以使用 @Aspect 注解来标识一个类为切面类,在切面类中我们可以定义切面逻辑,包括切入点、通知类型和切面顺序等,从而实现 AOP 编程的功能。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
MyAspect.java
/**
 * 这个类使用 @Aspect 注解标识,表示这个类是一个切面类。同时,我们还使用 @Component 注解标识这个类,以便 Spring 框架能够自动将它加入到 Spring 容器中。
 * 在这个例子中,我们定义了一个 MyAspect 类来实现某些功能的切面编程。在这个类中,我们定义了两个通知类型,即 @Before 和 @After,分别表示在目标方法执行前和执行后执行某些操作。这些通知类型的执行条件是通过切入点表达式来定义的。
 * @Aspect 注解用于标识一个类为切面类,可以使得开发者更加方便地使用 AOP 来实现某些功能。它是一种简单但非常有效的解决方案,可以让开发者更加轻松地使用切面编程来提高应用程序的性能和可维护性。
 * @Aspect 注解是 Spring 框架中比较常用的注解之一,用于标识一个类为切面类。需要注意的是,AOP 的使用需要谨慎操作,必要时需要考虑切入点、通知类型和切面顺序等来维护应用程序的性能和可维护性。
 */
@Aspect
@Component
public class MyAspect {
    @Before("execution(* com.example.UserService.*(..))")
    public void beforeAdvice() {
        System.out.println("Before advice is executed.");
    }
    
    @After("execution(* com.example.UserService.*(..))")
    public void afterAdvice() {
        System.out.println("After advice is executed.");
    }
}

# @Pointcut

此注解用于定义切点, @PointcutSpring 框架中的一个注解,它用于定义一个切入点,从而可以在该切入点上定义通知类型一实现 AOP(面向切面编程)

Spring 框架中,如果需要使用 AOP 来实现某些功能,我们可以使用 @Pointcut 注解来定义一个切入点,在切入点我们可以定义切面逻辑,包括通知类型和切面顺序等,从而实现 AOP 功能。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
MyAspect.java
/**
 * 这个类使用 @Aspect 注解标识,表示这个类是一个切面类。同时,我们还使用 @Component 注解标识这个类,以便 Spring 框架能够自动将它加入到 Spring 容器中。
 * 在这个例子中,我们定义了一个 MyAspect 类来实现某些功能的切面编程。在这个类中,我们使用 @Pointcut 注解定义了一个切入点,即 userServicePointcut () 方法。在这个切入点上,我们定义了两个通知类型,即 @Before 和 @After,分别表示在目标方法执行前和执行后执行某些操作。
 * @Pointcut 注解用于定义一个切入点,可以使得开发者更加方便地使用 AOP 来实现某些功能。它是一种简单但非常有效的解决方案,可以让开发者更加轻松地使用切面编程来提高应用程序的性能和可维护性。
 * @Pointcut 注解是 Spring 框架中比较常用的注解之一,用于定义一个切入点。需要注意的是,AOP 的使用需要谨慎操作,必要时需要考虑切入点、通知类型和切面顺序等来维护应用程序的性能和可维护性。
 */
@Aspect
@Component
public class MyAspect {
    @Pointcut("execution(* com.example.UserService.*(..))")
    public void userServicePointcut() {}
    
    @Before("userServicePointcut()")
    public void beforeAdvice() {
        System.out.println("Before advice is executed.");
    }
    
    @After("userServicePointcut()")
    public void afterAdvice() {
        System.out.println("After advice is executed.");
    }
}

# @Before

此注解用于在方法执行前执行前置通知, @BeforeSpring 框架中的一个注解,它用于定义在目标方法执行前执行的通知类型。

Spring 框架中,如果需要在目标方法执行前执行某些操作,就可以使用 @Before 注解来定义一个通知类型,在这个通知类型中,我们可以编写自己的逻辑代码从而实现 AOP 编程功能。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
MyAspect.java
@Aspect
@Component
public class MyAspect {
    @Before("execution(* com.example.UserService.*(..))")
    public void beforeAdvice() {
        System.out.println("Before advice is executed.");
    }
}

# @After

此注解用于在方法执行后执行后置通知, @AfterSpring 框架中的一个注解,它用于定义在目标方法执行后执行的通知类型。

Spring 框架中,如果需要在目标方法执行后执行某些操作,就可以使用 @After 注解来定义一个通知类型,在这个通知类型中,可以编写自己的逻辑代码,从而实现 AOP 编程功能。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
MyAspect.java
@Aspect
@Component
public class MyAspect {
    @After("execution(* com.example.UserService.*(..))")
    public void afterAdvice() {
        System.out.println("After advice is executed.");
    }
}

# @Around

此注解用于在方法执行前和执行后执行通知,也被称为环绕通知, @AroundSpring 框架中的一个注解,用于定义在目标方法执行前和执行后执行的通知类型。

Spring 框架中,如果需要在目标方法执行前后执行某些操作,就可以使用 @Around 注解来定义一个通知类型,在这个通知类型中可以编写自己的逻辑代码,从而实现 AOP 编程功能。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
MyAspect.java
@Aspect
@Component
public class MyAspect {
    @Around("execution(* com.example.UserService.*(..))")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Before advice is executed.");
        Object result = joinPoint.proceed();
        System.out.println("After advice is executed.");
        return result;
    }
}

# @AfterReturning

此注解用于在方法返回结果后执行通知,也被称为返回通知, @AfterReturningSpring 框架中的一个注解,它用于在目标方法返回结果后执行的通知类型。

Spring 框架中如果需要在目标方法返回结果后执行某些操作,就可以使用 @AfterReturning 注解来定义一个通知类型,在这个通知类型可以编写自己的逻辑代码,从而实现 AOP 编程功能。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
MyAspect.java
@Aspect
@Component
public class MyAspect {
    @AfterReturning(pointcut = "execution(* com.example.UserService.*(..))", returning = "result")
    public void afterReturningAdvice(Object result) {
        System.out.println("After returning advice is executed. Result is " + result);
    }
}

# @AfterThrowing

此注解用于在方法抛出异常后执行通知,也被称为异常通知, @AfterThrowingSpring 框架中的一个注解,它用于定义在目标方法抛出异常后执行的通知类型。

Spring 框架中,如果需要在目标方法抛出异常后执行某些操作,就可以使用 @AfterThrowing 注解来定义一个通知类型,在这个通知类型中可以编写自己的逻辑代码,从而实现 AOP 编程功能。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
MyAspect.java
@Aspect
@Component
public class MyAspect {
    @AfterThrowing(pointcut = "execution(* com.example.UserService.*(..))", throwing = "ex")
    public void afterThrowingAdvice(Exception ex) {
        System.out.println("After throwing advice is executed. Exception is " + ex);
    }
}

# @Order

此注解用于指定切面的执行顺序, @OrderSpring 框架中的一个注解,它用于定义切面的执行顺序。

Spring 框架中,如果有多个切面类需要对同一个方法进行切面处理,那么这些切面类的执行顺序可能会影响到最终结果,为了控制这些切面类的执行顺序,可以使用 @Order 注解来定义它们的执行顺序。

@Order 注解可以应用在切面类上,用于指定切面执行的顺序,它的参数为一个整数,数值越小表示优先级越高,数值相同时将按照类名的自然顺序进行排序。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
MyAspect1.java
@Aspect
@Component
@Order(1)
public class MyAspect1 {
    @Before("execution(* com.example.UserService.*(..))")
    public void beforeAdvice() {
        System.out.println("Before advice from MyAspect1 is executed.");
    }
}
MyAspect2.java
@Aspect
@Component
@Order(2)
public class MyAspect2 {
    @Before("execution(* com.example.UserService.*(..))")
    public void beforeAdvice() {
        System.out.println("Before advice from MyAspect2 is executed.");
    }
}

# @Slf4j

此注解用于简化日志记录, @Slf4jLombok 框架中的一个注解,它用于在 Java 类中自动生成日志记录器。

Java 开发中日志记录是非常重要的一个环节,它可以帮助我们更好地了解程序的运行状况,从而可以更好地进行优化和调试,通常情况下,我们需要手动引入日志框架如: Log4jSlf4j 等,并编写相应的日志记录代码,手动编写这些代码会比较繁琐并且还容易出现错误,为了日志记录过程, Lombok 框架提供了一个 @Slf4j 注解,它可以在 Java 类中自动生成日志记录器。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>
MyService.java
/**
 * 在这个例子中,我们定义了一个 MyService 类,并使用 @Slf4j 注解来自动生成日志记录器。然后,在 doSomething () 方法中,我们直接使用 log 变量来记录日志,而不需要再引入其他的日志框架。
 * 需要注意的是,使用 @Slf4j 注解需要在编译器中安装 Lombok 插件,否则可能会出现编译错误。另外,虽然 @Slf4j 注解非常方便,但在实际应用中,我们还需要根据实际情况选择合适的日志框架,并编写相应的日志记录代码。
 * 总之,@Slf4j 是 Lombok 框架中的一个注解,可以在 Java 类中自动生成日志记录器,从而简化日志记录的过程。它是一种极为方便的解决方案,可以提高应用程序的可维护性和可读性。
 */
@Slf4j
public class MyService {
    public void doSomething() {
        log.debug("This is a debug message.");
        log.info("This is an info message.");
        log.error("This is an error message.");
    }
}

# @Data

此注解用于自动生成 JavaBean 中的 getsettoStringhashCodeequals 方法。

@DataLombok 框架中的一个注解,它可以自动生成 Java 类的 getsettoStringhashCodeequals 方法。

在日常的 Java 开发中,有时候经常需要编写一些 POJO 类来表示数据结构,这些类通常包含一些成员变量,并且需要编写相应的 getset 等方法,为了简化这个过程 Lombok 框架提供了一个 @Data 注解就可以自动生成这些方法。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>
User.java
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
}

# @NoArgsConstructor

此注解用于生成无参构造函数, @NoArgsConstructorLombok 框架中的一个注解,它用于自动生成一个无参构造方法。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>
User.java
/**
 * 在这个例子中,我们定义了一个 User 类,并使用 @NoArgsConstructor 注解来自动生成一个无参构造方法。然后,在其他的 Java 类中,我们可以直接创建 User 对象的实例,而不需要手动编写无参构造方法。
 * 需要注意的是,使用 @NoArgsConstructor 注解需要在编译器中安装 Lombok 插件,否则可能会出现编译错误。另外,虽然 @NoArgsConstructor 注解非常方便,但在实际应用中,我们还需要根据实际情况选择合适的构造方法,并编写相应的代码。
 * 总之,@NoArgsConstructor 是 Lombok 框架中的一个注解,用于自动生成一个无参构造方法,从而简化 Java 开发的过程。它是一种极为方便的解决方案,可以提高应用程序的可维护性和可读性。
 */
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
}

# @AllArgsConstructor

此注解用于生成全参构造函数, @AllArgsConstructorLombok 框架中的一个注解,用于自动生成一个全参构造方法。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>
User.java
/**
 * 在这个例子中,我们定义了一个 User 类,并使用 @AllArgsConstructor 注解来自动生成一个全参构造方法。然后,在其他的 Java 类中,我们可以直接创建 User 对象的实例,并传入相应的参数,而不需要手动编写全参构造方法。
 * 需要注意的是,使用 @AllArgsConstructor 注解需要在编译器中安装 Lombok 插件,否则可能会出现编译错误。另外,虽然 @AllArgsConstructor 注解非常方便,但在实际应用中,我们还需要根据实际情况选择合适的构造方法,并编写相应的代码。
 * 总之,@AllArgsConstructor 是 Lombok 框架中的一个注解,用于自动生成一个全参构造方法,从而简化 Java 开发的过程。它是一种极为方便的解决方案,可以提高应用程序的可维护性和可读性。
 */
@AllArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
}

# @Builder

此注解用于生成 Builder 模式的构造函数, @BuilderLombok 框架中的一个注解,它用于自动生成一个 Builder 模式的构造器。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>
User.java
/**
 * 在这个例子中,我们定义了一个 User 类,并使用 @Builder 注解来自动生成一个 Builder 模式的构造器。然后,在其他的 Java 类中,我们可以使用链式调用的方式设置 User 对象的属性,并最终创建一个不可变的对象。
 * 需要注意的是,使用 @Builder 注解需要在编译器中安装 Lombok 插件,否则可能会出现编译错误。另外,虽然 @Builder 注解非常方便,但在实际应用中,我们还需要根据实际情况选择合适的构造方法,并编写相应的代码。
 * 总之,@Builder 是 Lombok 框架中的一个注解,用于自动生成一个 Builder 模式的构造器,从而简化 Java 开发的过程。它是一种极为方便的解决方案,可以提高应用程序的可维护性和可读性。
 */
@Builder
public class User {
    private Long id;
    private String name;
    private Integer age;
}

# @EqualsAndHashCode

此注解用于生成 hashCodeequals 方法, @EqualsAndHashCodeLombok 框架中的一个注解,它用于自动生成 equals()hashCode() 方法。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>
User.java
@EqualsAndHashCode
public class User {
    private Long id;
    private String name;
    private Integer age;
}

# @ToString

此注解用于生成 toString() 方法, @ToStringLombok 框架中的一个注解,它用于自动生成 toString() 方法,如果需要排除某些属性,可以使用 exclude 属性来指定排除的属性。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>
User.java
@ToString(exclude = "password")
public class User {
    private Long id;
    private String name;
    private String password;
}

# @Getter

此注解用于生成 get 方法, @GetterLombok 框架中的一个注解,用于自动生成 getter 方法。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>
User.java
@Getter
public class User {
    private Long id;
    private String name;
    private Integer age;
}

# @Setter

此注解用于生成 set 方法, @SetterLombok 框架中的一个注解,用于自动生成 setter 方法。

需要引入以下坐标才可以正常使用此注解。

pom.xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>
User.java
@Setter
public class User {
    private Long id;
    private String name;
    private Integer age;
}