SpringBoot 提供了很多个注解,可以帮助我们快速构建应用程序,以下是 SpringBoot 和其它的一些常用注解。
# 注解详情表
注解名称 | 参数类型 | 注解简介 | 框架 |
---|---|---|---|
@SpringBootApplication | 可空 | 用于标识 SpringBoot 应用程序的入口类 | SpringBoot |
@RestController | 可空 | 用于自动将返回值转换为 JSON 格式 | SpringWeb |
@RequestMapping | String/String[] | 用于映射 URL 请求 | SpringWeb |
@GetMapping | String/String[] | 用于映射 HTTP 的 GET 请求 | SpringWeb |
@PostMapping | String/String[] | 用于映射 HTTP 的 POST 请求 | SpringWeb |
@DeleteMapping | String/String[] | 用于映射 HTTP 的 DELETE 请求 | SpringWeb |
@RequestParam | String | 用于获取请求参数的值 | 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 |
@Value | String | 用于获取配置文件中的属性值 | Spring |
@Bean | 可空 | 用于将一个方法返回的对象注册到 Spring 容器中 | Spring |
@Import | Class<?>/Class<?>[] | 用于导入其他配置类或 Bean | Spring |
@Conditional | Class<? extends Condition>/Class<? extends Condition>[] | 用于根据条件判断是否创建 Bean 或执行配置 | Spring |
@Profile | String/String[] | 用于指定配置的环境 | Spring |
@PropertySource | String/String[] | 用于指定配置文件的位置 | Spring |
@Qualifier | String | 用于指定注入的 Bean 的名称 | Spring |
@ExceptionHandler | Class<? extends Throwable>/Class<? extends Throwable>[] | 用于处理异常 | SpringWeb |
@ResponseStatus | HttpStatus | 用于指定异常的 HTTP 响应状态码 | SpringWeb |
@ControllerAdvice | 可空 | 用于全局处理异常 | SpringWeb |
@CrossOrigin | String/String[] | 用于解决跨域问题 | SpringWeb |
@Async | 可空 | 用于将方法标记为异步执行 | Spring |
@Cacheable | String/String[] | 用于缓存方法的返回值 | Spring |
@CacheEvict | String/String[] | 用于清除缓存 | Spring |
@CachePut | String/String[] | 用于更新缓存中的数据 | Spring |
@Transactional | 可空 | 用于标识一个方法或类需要使用事务进行操作 | Spring |
@EnableTransactionManagement | 可空 | 此注解用于启用事物管理功能 | Spring |
@EnableAspectJAutoProxy | 可空 | 用于启用 AOP 功能 | Spring |
@Aspect | 可空 | 用于定义切面 | SpringAop |
@Pointcut | String | 用于定义切点 | SpringAop |
@Before | String | 用于在方法执行前执行通知 | SpringAop |
@After | String | 用于在方法执行后执行通知 | SpringAop |
@Around | String | 用于在方法执行前后执行通知 | SpringAop |
@AfterReturning | String | 用于在方法返回结果后执行通知 | SpringAop |
@AfterThrowing | String | 用于在方法抛出异常后执行通知 | SpringAop |
@Order | int | 用于指定切面的执行顺序 | Spring |
@Slf4j | 可空 | 用于简化日志记录 | Lombok |
@Data | 可空 | 用于自动生成 JavaBean 的 get 、 set 、 toString 、 hashCode 和 equals 方法 | Lombok |
@NoArgsConstructor | 可空 | 用于生成无参构造函数 | Lombok |
@AllArgsConstructor | 可空 | 用于生成全参构造函数 | Lombok |
@Builder | 可空 | 用于生成 Builder 模式的构造函数 | Lombok |
@EqualsAndHashCode | 可空 | 用于生成 hashCode 和 equals 方法 | 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
应用程序的配置和启动过程。
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
格式。@RestController
是SpringFramework 4.0
版本引入的一个注解,它是@Controller
和@ResponseBody
注解的组合。- 它用于标注一个类,表示这个类是一个
RESTful
风格的控制器,可以处理HTTP
请求并返回JSON/XML
格式的响应。 @RestController
用于代替原来的@Controller
注解,它默认情况下会将控制器方法的返回值转换为JSON
格式,并以HTTP
响应的方式返回给客户端。- 如果需要返回
XML
格式的响应,可以使用其它注解如:@Produces
和@Consumes
注解。
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
请求和控制器方法之间的关系,它可以用于类级别和方法级别,用于指定请求URL
和HTTP
方法如:GET
、POST
、PUT
、DELETE
等。
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
此注解用于映射
HTTP
的GET
请求。
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
此注解用于映射
HTTP
的POST
请求。
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
此注解用于映射
HTTP
的PUT
请求。
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
此注解用于映射
HTTP
的DELETE
请求。
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
此注解用于获取请求参数的值。
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
请求路径中的变量绑定到控制器方法的参数上。
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
请求体中的数据绑定到控制器方法的参数上。
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
响应的主体,@ResponseBody
是Spring MVC
框架中的一个注解,用于将控制器方法的返回值转换为HTTP
响应体中的数据。
@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
进行资源的注入。
@Service | |
public class UserServiceImpl implements UserService { | |
@Autowired | |
private UserRepository userRepository; | |
// 实现 UserService 接口中的方法 | |
} |
# @Component
此注解用于标识一个类是
Spring
容器中的组件,@Component
是Spring
框架中的一个通用注解,用于标注一个类作为Spring
组件中的Bean
。
@Component | |
public class UserServiceImpl implements UserService { | |
// 实现 UserService 接口中的方法 | |
} |
# @Service
此注解用于标识一个类是
Spring
容器中的服务组件,@Service
是Spring
框架中的一个注解,用于标注一个类作为服务类 (Service
)。
@Service | |
public class UserServiceImpl implements UserService { | |
// 实现 UserService 接口中的方法 | |
} |
# @Repository
此注解用于标识一个类是
Spring
容器中的数据访问组件,@Repository
是Spring
框架中的一个注解,用于标注一个类作为数据访问对象 (DAO
)。
@Repository | |
public class UserRepositoryImpl implements UserRepository { | |
// 实现 UserRepository 接口中的方法 | |
} |
# @Configuration
此注解用于标识一个类是
Spring
的配置类,@Configuration
是Spring
框架中的一个注解,用于标注一个类作为配置类。
@Configuration | |
public class AppConfig { | |
@Bean | |
public UserService userService() { | |
return new UserServiceImpl(); | |
} | |
@Bean | |
public UserRepository userRepository() { | |
return new UserRepositoryImpl(); | |
} | |
} |
# @Value
此注解用于获取配置文件中的属性值,
@Value
是Spring
框架中的一个注解,用于将配置文件中的属性值注入到Bean
对象中。
/** | |
* 这个类使用 @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
容器中,@Bean
是Spring
框架中的一个注解,用于将一个方法返回的对象注册为一个Spring Bean
。
@Configuration | |
public class AppConfig { | |
@Bean | |
public UserService userService() { | |
return new UserServiceImpl(); | |
} | |
@Bean | |
public UserRepository userRepository() { | |
return new UserRepositoryImpl(); | |
} | |
} |
# @Import
此注解用于导入其它配置类或
Bean
。
@Configuration | |
@Import({AppConfig1.class, AppConfig2.class}) | |
public class AppConfig { | |
// 其他方法 | |
} |
# @Conditional
此注解用于根据条件判断是否创建
Bean
或执行配置。
@Configuration | |
public class AppConfig { | |
@Bean | |
@Conditional(DatabaseTypeCondition.class) | |
public UserRepository userRepository() { | |
return new UserRepositoryImpl(); | |
} | |
// 其他方法 | |
} |
# @Profile
此注解用于指定配置的环境,如开发环境、测试环境或生产环境。
@Configuration | |
public class AppConfig { | |
@Bean | |
@Profile("dev") | |
public UserService userServiceDev() { | |
return new UserServiceDevImpl(); | |
} | |
@Bean | |
@Profile("prod") | |
public UserService userServiceProd() { | |
return new UserServiceProdImpl(); | |
} | |
// 其他方法 | |
} |
# @PropertySource
此注解用于指定配置文件的位置,
@PropertySource
是Spring
框架中的一个注解,用于指定一组属性文件的位置,从而可以在Spring
应用程序中使用这些属性。
/** | |
* 这个类使用 @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
的名称。
@Component | |
public class UserServiceImpl implements UserService { | |
@Autowired | |
@Qualifier("userRepositoryImpl") | |
private UserRepository userRepository; | |
// 其他方法 | |
} |
# @ExceptionHandler
此注解用于处理异常。
/** | |
* 这个类使用 @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
响应状态码。
@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
此注解用于处理全局异常,
@ControllerAdvice
是Spring
框架中的一个注解,用于定义全局控制器通知。
在
Spring MVC
框架中,控制器通知是一些特殊的组件,它们可以在控制器方法执行前或执行后抛出异常时执行一些额外的逻辑处理,使用@ControllerAdvice
注解可以定义全局控制器通知,它可以应用于所有的控制器。
/** | |
* 这个类使用 @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
方法。
/** | |
* 这个类使用 @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
注解来将这个方法的执行异步化,让主线程继续执行其它任务,从而提高应用程序的响应性能。
/** | |
* 这个类使用 @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
注解将这个方法的返回结果缓存起来,下次执行这个方法时直接从缓存中获取结果即可,避免重复执行。
/** | |
* 这个类使用 @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
注解将这个方法的缓存数据清空,这样下次执行这个方法时就会重新查询数据并缓存起来。
/** | |
* 这个类使用 @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
注解将这个方法的返回结果更新或添加到缓存中。
/** | |
* 这个类使用 @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
@Transactional
是Spring
框架中的一个注解,用于标识一个方法或类需要使用事务进行操作。@Transactional
注解在Spring
框架中用于声明事务管理,它允许开发者通过简单的注解来控制事务的边界,具体来说,@Transactional
注解的作用包括以下五种特性:只读标记
:通过设置为只读,可以告诉Spring
事务的类型,这有助于优化事务的性能。隔离级别
:定义了事务的隔离级别,用于解决并发事务中的问题,如脏读、不可重复读等,例如:ISOLATION_READ_COMMITTED
表示事务只能读取已经提交的数据。超时时间
:定义了事务的超时时间,超过这个时间,事务将自动回滚,例如:timeout = 30
表示事务最多运行30
秒。回滚规则
:定义了哪些异常会导致事务回滚,默认情况下,只有运行时检查的异常会导致事务回滚,而受检异常不会。事务传播行为
:定义了方法调用时事务如何传播,比如是否新开一个事务,或者加入到已有的事务中,例如:PROPAGATION_REQUIRED
表示如果当前没有事务,就新建一个事务,如果已经存在事务则加入这个事务中。
@Transactional
注解通常用于服务层的方法上,以确保业务操作的原子性、一致性、隔离性和持久性,它是实现声明事务管理的一种便捷方式,使得事务管理变得更加简单和直观。- 在
Spring
框架中,如果一个方法需要对数据库进行操作,我们可以使用@Transactional
注解来确保这个操作在一个事务中进行,从而保证操作的原子性、一致性、隔离性和持久性。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-tx</artifactId> | |
<version>5.0.8.RELEASE</version> | |
</dependency> |
/** | |
* 这个类使用 @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); | |
} | |
} | |
} |
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
此注解用于启用事物管理功能,
@EnableTransactionManagement
在Spring
框架中用于开启基于注解的事务管理,它主要用于告诉Spring
容器需要创建一个事务管理器 (PlatformTransactionManager
), 并将其注册到Spring
上下文中,一旦事务管理器被创建并配置好,就可以通过@Transactional
注解在服务层的方法上声明事务的边界了。
当你在某个配置类上添加了
@EnableTransactionManagement
注解后,Spring
会根据配置的事务管理器类型如:JPA
、JDBC
、Hibernate
等来创建相应的事务管理实例,当应用中的方法被标注为@Transactional
时,Spring
就能够利用配置好的事务管理器来管理事务,简而言之@EnableTransactionManagement
注解是用于开启Spring
声明式事务管理的关键步骤,它使得@Transactional
注解能够正常工作。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-tx</artifactId> | |
<version>5.0.8.RELEASE</version> | |
</dependency> |
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
功能,@EnableAspectJAutoProxy
是Spring
框架中的一个注解,用于启用自动代理功能,以便使用AOP(面向切面编程)
进行编程。
在
Spring
框架中,如果需要使用AOP
来实现某些功能,就可以使用@EnableAspectJAutoProxy
注解来启用自动代理功能,从而在运行时自动为我们生成代理对象,以便进行切面编程。
/** | |
* 这个类使用 @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
此注解用于定义切面,
@Aspect
是Spring
框架中的一个注解,它用于标识一个类为切面类,从而可以在该类中定义切面逻辑以实现AOP(面向切面编程)
。
在
Spring
框架中,如果需要使用AOP
来实现某些功能,我们可以使用@Aspect
注解来标识一个类为切面类,在切面类中我们可以定义切面逻辑,包括切入点、通知类型和切面顺序等,从而实现AOP
编程的功能。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-aop</artifactId> | |
</dependency> |
/** | |
* 这个类使用 @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
此注解用于定义切点,
@Pointcut
是Spring
框架中的一个注解,它用于定义一个切入点,从而可以在该切入点上定义通知类型一实现AOP(面向切面编程)
。
在
Spring
框架中,如果需要使用AOP
来实现某些功能,我们可以使用@Pointcut
注解来定义一个切入点,在切入点我们可以定义切面逻辑,包括通知类型和切面顺序等,从而实现AOP
功能。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-aop</artifactId> | |
</dependency> |
/** | |
* 这个类使用 @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
此注解用于在方法执行前执行前置通知,
@Before
是Spring
框架中的一个注解,它用于定义在目标方法执行前执行的通知类型。
在
Spring
框架中,如果需要在目标方法执行前执行某些操作,就可以使用@Before
注解来定义一个通知类型,在这个通知类型中,我们可以编写自己的逻辑代码从而实现AOP
编程功能。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-aop</artifactId> | |
</dependency> |
@Aspect | |
@Component | |
public class MyAspect { | |
@Before("execution(* com.example.UserService.*(..))") | |
public void beforeAdvice() { | |
System.out.println("Before advice is executed."); | |
} | |
} |
# @After
此注解用于在方法执行后执行后置通知,
@After
是Spring
框架中的一个注解,它用于定义在目标方法执行后执行的通知类型。
在
Spring
框架中,如果需要在目标方法执行后执行某些操作,就可以使用@After
注解来定义一个通知类型,在这个通知类型中,可以编写自己的逻辑代码,从而实现AOP
编程功能。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-aop</artifactId> | |
</dependency> |
@Aspect | |
@Component | |
public class MyAspect { | |
@After("execution(* com.example.UserService.*(..))") | |
public void afterAdvice() { | |
System.out.println("After advice is executed."); | |
} | |
} |
# @Around
此注解用于在方法执行前和执行后执行通知,也被称为环绕通知,
@Around
是Spring
框架中的一个注解,用于定义在目标方法执行前和执行后执行的通知类型。
在
Spring
框架中,如果需要在目标方法执行前后执行某些操作,就可以使用@Around
注解来定义一个通知类型,在这个通知类型中可以编写自己的逻辑代码,从而实现AOP
编程功能。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-aop</artifactId> | |
</dependency> |
@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
此注解用于在方法返回结果后执行通知,也被称为返回通知,
@AfterReturning
是Spring
框架中的一个注解,它用于在目标方法返回结果后执行的通知类型。
在
Spring
框架中如果需要在目标方法返回结果后执行某些操作,就可以使用@AfterReturning
注解来定义一个通知类型,在这个通知类型可以编写自己的逻辑代码,从而实现AOP
编程功能。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-aop</artifactId> | |
</dependency> |
@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
此注解用于在方法抛出异常后执行通知,也被称为异常通知,
@AfterThrowing
是Spring
框架中的一个注解,它用于定义在目标方法抛出异常后执行的通知类型。
在
Spring
框架中,如果需要在目标方法抛出异常后执行某些操作,就可以使用@AfterThrowing
注解来定义一个通知类型,在这个通知类型中可以编写自己的逻辑代码,从而实现AOP
编程功能。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-aop</artifactId> | |
</dependency> |
@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
此注解用于指定切面的执行顺序,
@Order
是Spring
框架中的一个注解,它用于定义切面的执行顺序。
在
Spring
框架中,如果有多个切面类需要对同一个方法进行切面处理,那么这些切面类的执行顺序可能会影响到最终结果,为了控制这些切面类的执行顺序,可以使用@Order
注解来定义它们的执行顺序。
@Order
注解可以应用在切面类上,用于指定切面执行的顺序,它的参数为一个整数,数值越小表示优先级越高,数值相同时将按照类名的自然顺序进行排序。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-aop</artifactId> | |
</dependency> |
@Aspect | |
@Component | |
@Order(1) | |
public class MyAspect1 { | |
@Before("execution(* com.example.UserService.*(..))") | |
public void beforeAdvice() { | |
System.out.println("Before advice from MyAspect1 is executed."); | |
} | |
} |
@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
此注解用于简化日志记录,
@Slf4j
是Lombok
框架中的一个注解,它用于在Java
类中自动生成日志记录器。
在
Java
开发中日志记录是非常重要的一个环节,它可以帮助我们更好地了解程序的运行状况,从而可以更好地进行优化和调试,通常情况下,我们需要手动引入日志框架如:Log4j
、Slf4j
等,并编写相应的日志记录代码,手动编写这些代码会比较繁琐并且还容易出现错误,为了日志记录过程,Lombok
框架提供了一个@Slf4j
注解,它可以在Java
类中自动生成日志记录器。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.projectlombok</groupId> | |
<artifactId>lombok</artifactId> | |
<version>1.18.26</version> | |
</dependency> |
/** | |
* 在这个例子中,我们定义了一个 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
中的get
、set
、toString
、hashCode
、equals
方法。
@Data
是Lombok
框架中的一个注解,它可以自动生成Java
类的get
、set
、toString
、hashCode
、equals
方法。
在日常的
Java
开发中,有时候经常需要编写一些POJO
类来表示数据结构,这些类通常包含一些成员变量,并且需要编写相应的get
、set
等方法,为了简化这个过程Lombok
框架提供了一个@Data
注解就可以自动生成这些方法。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.projectlombok</groupId> | |
<artifactId>lombok</artifactId> | |
<version>1.18.26</version> | |
</dependency> |
@Data | |
public class User { | |
private Long id; | |
private String name; | |
private Integer age; | |
} |
# @NoArgsConstructor
此注解用于生成无参构造函数,
@NoArgsConstructor
是Lombok
框架中的一个注解,它用于自动生成一个无参构造方法。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.projectlombok</groupId> | |
<artifactId>lombok</artifactId> | |
<version>1.18.26</version> | |
</dependency> |
/** | |
* 在这个例子中,我们定义了一个 User 类,并使用 @NoArgsConstructor 注解来自动生成一个无参构造方法。然后,在其他的 Java 类中,我们可以直接创建 User 对象的实例,而不需要手动编写无参构造方法。 | |
* 需要注意的是,使用 @NoArgsConstructor 注解需要在编译器中安装 Lombok 插件,否则可能会出现编译错误。另外,虽然 @NoArgsConstructor 注解非常方便,但在实际应用中,我们还需要根据实际情况选择合适的构造方法,并编写相应的代码。 | |
* 总之,@NoArgsConstructor 是 Lombok 框架中的一个注解,用于自动生成一个无参构造方法,从而简化 Java 开发的过程。它是一种极为方便的解决方案,可以提高应用程序的可维护性和可读性。 | |
*/ | |
@NoArgsConstructor | |
public class User { | |
private Long id; | |
private String name; | |
private Integer age; | |
} |
# @AllArgsConstructor
此注解用于生成全参构造函数,
@AllArgsConstructor
是Lombok
框架中的一个注解,用于自动生成一个全参构造方法。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.projectlombok</groupId> | |
<artifactId>lombok</artifactId> | |
<version>1.18.26</version> | |
</dependency> |
/** | |
* 在这个例子中,我们定义了一个 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
模式的构造函数,@Builder
是Lombok
框架中的一个注解,它用于自动生成一个Builder
模式的构造器。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.projectlombok</groupId> | |
<artifactId>lombok</artifactId> | |
<version>1.18.26</version> | |
</dependency> |
/** | |
* 在这个例子中,我们定义了一个 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
此注解用于生成
hashCode
和equals
方法,@EqualsAndHashCode
是Lombok
框架中的一个注解,它用于自动生成equals()
和hashCode()
方法。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.projectlombok</groupId> | |
<artifactId>lombok</artifactId> | |
<version>1.18.26</version> | |
</dependency> |
@EqualsAndHashCode | |
public class User { | |
private Long id; | |
private String name; | |
private Integer age; | |
} |
# @ToString
此注解用于生成
toString()
方法,@ToString
是Lombok
框架中的一个注解,它用于自动生成toString()
方法,如果需要排除某些属性,可以使用 exclude 属性来指定排除的属性。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.projectlombok</groupId> | |
<artifactId>lombok</artifactId> | |
<version>1.18.26</version> | |
</dependency> |
@ToString(exclude = "password") | |
public class User { | |
private Long id; | |
private String name; | |
private String password; | |
} |
# @Getter
此注解用于生成
get
方法,@Getter
是Lombok
框架中的一个注解,用于自动生成getter
方法。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.projectlombok</groupId> | |
<artifactId>lombok</artifactId> | |
<version>1.18.26</version> | |
</dependency> |
@Getter | |
public class User { | |
private Long id; | |
private String name; | |
private Integer age; | |
} |
# @Setter
此注解用于生成
set
方法,@Setter
是Lombok
框架中的一个注解,用于自动生成setter
方法。
需要引入以下坐标才可以正常使用此注解。
<dependency> | |
<groupId>org.projectlombok</groupId> | |
<artifactId>lombok</artifactId> | |
<version>1.18.26</version> | |
</dependency> |
@Setter | |
public class User { | |
private Long id; | |
private String name; | |
private Integer age; | |
} |