常用注解概览:
注解 | 描述 |
---|---|
@Autowired | 用于自动装配Bean依赖,由Spring框架提供。 |
@Component | 用于将类标记为Spring的组件,表示这个类会被Spring进行管理。 |
@ControllerAdvice | 用于定义全局异常处理器类,可以捕获应用中抛出的异常,并统一处理。 |
@Data | 自动生成通用的方法,如equals、hashCode、toString、getter和setter等。 |
@ExceptionHandler | 用于标记方法,指定该方法处理特定异常类型。 |
@Override | 用于标记方法重写父类或接口中的方法,编译器会检查是否正确重写。 |
@PathVariable | 用于从URL路径中获取参数值,将参数绑定到方法的参数上。 |
@RequestMapping | 用于将请求URL映射到处理请求的方法上,指定HTTP方法、路径等。 |
@RequestBody | 用于将请求体中的内容绑定到方法的参数上,通常用于接收JSON或XML格式的请求数据。 |
@ResponseBody | 用于将方法的返回值直接作为响应体返回给客户端,通常用于返回JSON或XML格式的响应数据。 |
@RestController | 将类标识为一个控制器,并默认返回JSON或XML格式的响应。 |
@Slf4j | Lombok 提供的注解,自动生成一个日志记录器变量,用于方便地在代码中进行日志记录。 |
@Resource | 实现依赖注入,将相应的依赖对象注入到目标类中。 |
@Transactional | 标记事务的边界,在方法执行时开启一个事务,并根据执行结果进行事务的提交或回滚。 |
@RequestParam | 用于从请求参数中获取值,将参数绑定到方法的参数上。 |
@Aspect | 切面,标记一个类为切面类,其中定义了切面的逻辑和通知的行为 |
@Pointcut | 切点,用于定义切入点表达式,指定在哪些连接点上应用切面逻辑。 |
@Before | 前置通知,指定在目标方法执行之前执行的逻辑。 |
@After | 后置通知,指定在目标方法执行之后执行的逻辑,无论方法是否发生异常都会执行。 |
@AfterReturning | 返回通知,指定在目标方法正常返回后执行的逻辑。 |
@AfterThrowing | 异常通知,指定在目标方法抛出异常后执行的逻辑。 |
@Around | 环绕通知,指定包围目标方法的逻辑,在方法执行前后都可以执行自定义的操作。 |
1.@Autowired & @Resource
@Autowired和@Resource都是用于依赖注入的注解,但它们在使用方式和依赖对象的查找方式上有所不同。
1.1 @Autowired
@Autowired注解是Spring框架提供的注解,它根据类型进行自动装配
@Component
public class UserService {
@Autowired
private User user;
}
在上述示例中,使用@Autowired注解将User对象注入到UserService类中,Spring容器会根据UserRepository类型进行自动装配,并将匹配的Bean注入到user字段中。
1.2 @Resource
@Resource注解是JavaEE提供的注解,也可以用于依赖注入。它提供了更灵活的方式进行依赖对象的查找,可以按照名称或类型进行注入。
@Component
public class UserService {
@Resource
private User user;
}
在上述示例中,使用@Resource注解将User对象注入到UserService类的中,@Resource注解默认按照字段名进行依赖对象的查找和匹配,也可以通过name属性指定依赖对象的名称
1.3 @Autowired & @Resource的区别
1.@Autowired注解是Spring提供的,用于自动装配Bean依赖。它可以通过类型匹配来自动注入依赖对象,但如果存在多个符合条件的候选对象时,默认使用byType的方式进行自动装配。
2.@Resource注解是JavaEE提供的,也可以用于自动装配依赖对象。它可以通过名称匹配来自动注入依赖对象,默认使用byName的方式进行自动装配。
2.@Component & @Controller & @Service & @Mapper
@Component:用于将类标记为Spring的组件,表示这个类会被Spring进行管理。它是一个通用的注解,可以用于标记任何类。通常用于标记普通的Java类,表示这些类需要由Spring进行实例化和管理。
而@Controller、@Service和@Mapper则是更具体的角色注解
作用 | |
---|---|
实例化对象 | 当 Spring 容器启动时,会扫描配置文件或基于注解的配置类,并创建被 @Component 注解标记的类的实例。对象的创建工作由 Spring 容器完成。 |
组件扫描 | @Component 注解是基于组件扫描的机制实现的。Spring 容器会扫描指定的包路径,查找所有被 @Component 注解标记的类,并将其实例化为 Spring 管理的组件。 |
依赖注入 | 被 @Component 注解标记的类可以通过 Spring 的依赖注入机制获取其他组件的实例。使用 @Autowired 或其他注解来注入依赖的组件。 |
AOP 支持 | @Component 注解是实现面向切面编程(AOP)的基础。通过在组件类上添加 @Aspect 注解,将其标记为切面类,实现对方法的增强、日志记录、事务管理等功能。 |
3.@Aspect & @Pointcut & @Before @After & @Around & @AfterReturning & @AfterThrowing & @Transactional
这些注解的组合可以用于实现面向切面编程(AOP)的功能。通过定义切面类并结合这些注解,可以在特定的连接点上执行增强操作,例如日志记录、事务管理、性能监控等
@Aspect
@Component
public class CustomAdvice {
//切点
@Pointcut("execution(* com.property.service.impl.*.*(..))")
public void pc(){}
@Before("pc()")
public void before(){System.out.println("-----");}
}
@Aspect | 切面,标记一个类为切面类,其中定义了切面的逻辑和通知的行为 |
@Pointcut | 切点,用于定义切入点表达式,指定在哪些连接点上应用切面逻辑。 |
@Before | 前置通知,指定在目标方法执行之前执行的逻辑。 |
@After | 后置通知,指定在目标方法执行之后执行的逻辑,无论方法是否发生异常都会执行。 |
@AfterReturning | 返回通知,指定在目标方法正常返回后执行的逻辑。 |
@AfterThrowing | 异常通知,指定在目标方法抛出异常后执行的逻辑。 |
@Around | 环绕通知,指定包围目标方法的逻辑,在方法执行前后都可以执行自定义的操作。 |
@Transactional | 指示 Spring 在方法执行时开启一个事务,并在方法执行结束时根据执行结果进行事务的提交或回滚 |
//rollbackFor 因为抛指定异常回滚
//noRollbackFor 不因为指定的异常回滚
//spring在管理事务时只有遇到运行时异常才会回滚,默认情况下编译时异常不行
//@Transactional(rollbackFor = OutOddStockException.class)
4.@ControllerAdvice & @ExceptionHandler
@ControllerAdvice 是一个注解,用于定义全局异常处理器类。它可以用于捕获应用中抛出的异常,并统一处理这些异常,提供自定义的异常处理逻辑。
@ExceptionHandler 是 @ControllerAdvice 注解下的一个注解,用于标记异常处理方法。它指定了该方法可以处理特定类型的异常。
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseResult<Object> HandlerException(Exception e){
//判断异常类型,根据不同异常类型,进行不同的处理
if(e instanceof IOException){
//文件处理
log.debug("文件处理异常");
}else if(e instanceof IndexOutOfBoundsException){
//越界异常
log.debug("越界异常");
}else if(e instanceof ArithmeticException){
//除0
log.debug("除零");
}
return new ResponseResult<>(500,e.getMessage(),null);
}
}
@RestControllerAdvice 是一个注解,结合了 @RestController 和 @ControllerAdvice 的功能
1.@RestControllerAdvice 注解标记了 GlobalExceptionHandler 类,表示它是一个全局异常处理器类,并且可以返回响应体
2.定义了一个异常处理方法 handleException,它使用 @ExceptionHandler(Exception.class) 注解标记,表示该方法用于处理 Exception 类型的异常。
5.@Data & @NoArgsConstructor & @AllArgsConstructor
@Data、@NoArgsConstructor 和 @AllArgsConstructor 是 Lombok 提供的注解,用于自动生成类的通用方法和构造函数。
@Data | 自动生成通用的方法,如equals、hashCode、toString、getter和setter等。 |
@NoArgsConstructor | 无参构造 |
@AllArgsConstructor | 有参构造 |
6.@Override
@Override 是 Java 中的注解之一,用于标记一个方法覆盖(重写)了父类或接口中的方法
7.@PathVariable & @RequestParam & @RequestBody
@PathVariable、@RequestParam和@RequestBody是Spring框架中用于处理HTTP请求参数的注解
7.1 @PathVariable
@PathVariable注解用于从请求的URL路径中获取参数值。它将URL中的占位符与方法参数进行绑定。
axios.get('/users/' + id).then(response => {// 处理返回的响应数据})
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable("id") int id) {
// 根据id获取用户
// 返回用户信息的ResponseEntity对象
}
}
7.2 @RequestParam
@RequestParam注解用于从请求的查询字符串或表单参数中获取参数值,它可以指定参数的名称和默认值。
axios.get('/users/search', {params: {name: 'John'}}).then(response => {// 处理返回的响应数据})
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/search")
public ResponseEntity<List<User>> searchUsers(@RequestParam("name") String name) {
// 根据name查询用户
// 返回包含用户信息的ResponseEntity对象
}
}
7.3 @RequestBody
@RequestBody注解用于从请求体中获取参数值,它将请求的内容绑定到方法参数上,通常用于处理POST请求中的JSON或XML数据。
axios.post('/users', {name: 'John',age: 25}).then(response => {// 处理返回的响应数据})
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping("/")
public ResponseEntity<User> createUser(@RequestBody User user) {
// 创建新用户
// 返回创建的用户信息的ResponseEntity对象
}
}
8.@RequestMapping & @ResponseBody
@RequestMapping和@ResponseBody是Spring MVC中用于处理HTTP请求和响应的注解
8.1 @RequestMapping
@RequestMapping注解用于映射URL路径到控制器方法,通过在方法上使用该注解,可以指定处理特定URL请求的方法。可以通过多种方式配置该注解,例如指定请求的HTTP方法(GET、POST等)、路径、请求参数等。
8.2 @ResponseBody
@ResponseBody注解用于指示方法返回的结果要作为响应体直接返回,而不是视图名称。当使用@ResponseBody注解时,返回的数据会直接序列化为JSON或其他格式的响应体返回给客户端。
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
@ResponseBody
public User getUserById(@PathVariable Long id) {
// 根据ID查询用户信息并返回
User user = userService.getUserById(id);
return user;
}
}
10.@Slf4j
@Slf4j是一个Java库,它提供了一种简洁的方式来在代码中使用日志记录功能。它是基于Simple Logging Facade for Java (SLF4J)的一个注解,可以通过在类或字段上添加@Slf4j注解来自动创建一个名为"log"的日志记录器。
使用@Slf4j注解后,就可以在代码中直接使用"log"日志记录器,而无需手动创建和初始化。可以使用不同的日志级别(如debug、info、warn、error)以及不同的日志方法(如debug()、info()、warn()、error())记录日志信息。
@Slf4j
public class ExampleClass {
public void someMethod() {
log.debug("This is a debug message");
log.info("This is an info message");
log.warn("This is a warning message");
log.error("This is an error message");
}
}