Spring中常用注解
控制器注解
- @Controller:用于标识控制器类,处理用户请求。
- @RestController:与 @Controller 类似,但是自带 @ResponseBody,常用于返回 JSON 格式的数据。
1、请求映射注解
- @RequestMapping:用于映射请求 URL 和处理方法,可以用于类和方法级别。
- @GetMapping:用于映射 HTTP GET 请求。
- @PostMapping:用于映射 HTTP POST 请求。
- @PutMapping:用于映射 HTTP PUT 请求。
- @DeleteMapping:用于映射 HTTP DELETE 请求。
- @PatchMapping:用于映射 HTTP PATCH 请求。
2、参数绑定注解
- @PathVariable:用于将 URL 中的占位符参数绑定到处理方法的参数中。
- @RequestParam:用于将请求参数绑定到处理方法的参数中。
- @RequestBody:用于将请求体中的数据绑定到处理方法的参数中。
- @RequestHeader:用于将请求头中的数据绑定到处理方法的参数中。
- @CookieValue:用于将 Cookie 中的数据绑定到处理方法的参数中。
- @ModelAttribute:用于将请求参数绑定到模型对象中,常用于表单数据的提交和验证。
- @SessionAttribute:用于将模型对象的属性暂存到会话中,方便多个请求之间共享数据。
3、响应视图注解
- @ResponseBody:用于将处理方法的返回值转换为指定格式的响应数据,常用于返回 JSON 格式的数据。
- @ModelAttribute:用于将模型对象的属性暂存到会话中,方便多个请求之间共享数据。
- @SessionAttributes:用于将模型对象的属性暂存到会话中,方便多个请求之间共享数据。
- @ResponseStatus:用于指定处理方法的响应状态码和原因短语,常用于请求出现异常时返回错误码。
4、其他注解
- @Autowired:用于自动装配依赖对象,常用于实现依赖注入。
- @Qualifier:用于指定依赖对象的名称,常用于解决多个同类型依赖对象的注入问题。
- @Component:用于标识组件类,被 Spring 自动扫描并装配。
- @Service:用于标识服务类,通常作为业务逻辑的实现类。
- @Repository:用于标识数据访问对象类,通常与 DAO 层的实现类对应。
- @Transactional:用于指定事务的处理方式,常用于控制事务的提交和回滚。
- @InitBinder:用于注册表单属性编辑器或格式化器,用于处理表单数据的绑定和格式化。
- @Valid:用于开启参数验证功能,可以结合 javax.validation 包中的注解进行参数验证。
- @ExceptionHandler:用于捕获处理方法中抛出的异常,并进行统一的异常处理,可以指定处理的异常类型和返回的视图或数据。
- @Async:用于指定方法为异步方法,常用于提高系统的并发性能。
- @Scheduled:用于指定方法为定时任务,常用于实现定时任务的调度。
- @Value:用于注入配置属性值,常用于获取配置文件中的属性值。
- @DateTimeFormat 转换前端传来的日期格式
- @SpringBootApplication:该注解是Spring Boot项目的入口注解,可以替代@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解。其中,@Configuration用于定义配置类,@EnableAutoConfiguration用于自动配置Spring上下文,@ComponentScan用于自动扫描Bean组件。@SpringBootApplication可以将这三个注解合并到一起,简化了Spring Boot项目的配置。
- @EnableAutoConfiguration:该注解用于自动配置Spring上下文,根据项目中的依赖自动配置项目所需的Bean组件。其中,@EnableAutoConfiguration是基于Spring Boot的starter机制实现的,通过starter机制可以自动引入所需的依赖,例如,引入了spring-boot-starter-web依赖后,就可以自动配置Spring MVC所需的Bean组件。
- @ConfigurationProperties:该注解用于从配置文件中读取配置值,可以用在配置类上,用于注入配置值。例如,@ConfigurationProperties(prefix = “app”) public class AppConfig {}可以将配置文件中以app为前缀的属性值注入到AppConfig类中。
- @EnableAsync:该注解用于启用异步处理,可以用在配置类上,用于开启异步处理的功能。例如,@Configuration @EnableAsync public class AppConfig {}可以开启异步处理的功能。
- @EnableScheduling:该注解用于启用定时任务,可以用在配置类上,用于开启定时任务的功能。例如,@Configuration @EnableScheduling public class AppConfig {}可以开启定时任务的功能。
- @SpringBootTest:该注解用于测试Spring Boot应用程序,可以用在测试类上,用于启动Spring Boot应用程序并测试其功能。例如,@SpringBootTest public class UserServiceTest {}可以测试UserService类的功能。
- @JsonInclude:该注解用于序列化Java对象为JSON格式时,控制序列化的包含和排除规则。例如,@JsonInclude(JsonInclude.Include.NON_NULL)表示只序列化非空属性。
- @Scope注解是用于指定Bean的作用域的注解。在Spring框架中,Bean可以具有不同的作用域,例如,单例(Singleton)、原型(Prototype)、会话(Session)和请求(Request)等。通过在Bean类或Bean定义上添加@Scope注解,可以指定Bean的作用域。
- @PreAuthorize:在方法执行之前对用户进行访问控制检查。通过在方法或类上使用 @PreAuthorize
注解,可以在方法执行之前定义访问控制规则,以限制哪些用户可以访问该方法。
扩展
1、@Scope注解
singleton:该属性指定Bean为单例模式,即在Spring上下文中只存在一个Bean实例。默认值为singleton。
prototype:该属性指定Bean为原型模式,即在每次请求时都会创建一个新的Bean实例。每个Bean实例都有自己的属性值和状态。
request:该属性指定Bean为请求模式,即在Web应用程序中,每个HTTP请求都会创建一个新的Bean实例。每个请求中使用的Bean实例都有自己的属性值和状态,不同请求中的Bean实例是相互独立的。
session:该属性指定Bean为会话模式,即在Web应用程序中,每个HTTP会话都会创建一个新的Bean实例。每个会话中使用的Bean实例都有自己的属性值和状态,不同会话中的Bean实例是相互独立的。
globalSession:该属性指定Bean为全局会话模式,仅在Portlet环境下使用。全局会话模式与会话模式类似,但是全局会话是跨多个Portlet和多个HTTP请求的,因此它可以在整个Web应用程序中共享数据。
使用@Scope注解可以控制Bean的生命周期和作用域,从而更好地管理Bean。例如,对于一些需要频繁创建和销毁的Bean,可以使用prototype模式,减少内存占用和资源浪费;对于一些需要共享状态的Bean,可以使用singleton模式,保证Bean的状态一致性。
2、@PreAuthorize注解
@PreAuthorize 注解的常用参数如下:
- value:定义访问控制规则的 SpEL 表达式。
- condition:定义访问控制规则的 SpEL 表达式。与 value 参数类似,它们的作用相同,只是名称不同。
- hasRole:检查当前用户是否拥有指定的角色。例如:@PreAuthorize(“hasRole(‘ROLE_ADMIN’)”),表示只有拥有 ROLE_ADMIN 角色的用户才能访问该方法。
- hasAnyRole:检查当前用户是否拥有指定的任意一个角色。例如:@PreAuthorize(“hasAnyRole(‘ROLE_ADMIN’,‘ROLE_USER’)”) 表示只有拥有 ROLE_ADMIN 或 ROLE_USER 角色的用户才能访问该方法。
- hasAuthority:检查当前用户是否拥有指定的权限。例如:@PreAuthorize(“hasAuthority(‘READ_ONLY’)”)表示只有拥有 READ_ONLY 权限的用户才能访问该方法。
- hasAnyAuthority:检查当前用户是否拥有指定的任意一个权限。例如@PreAuthorize(“hasAnyAuthority(‘READ_ONLY’,‘WRITE_ONLY’)”) 表示只有拥有 READ_ONLY 或 WRITE_ONLY 权限的用户才能访问该方法。
- principal:检查当前用户是否与指定的用户匹配。例如:@PreAuthorize(“#account.owner ==principal.username”) 表示只有当前用户是 account 所属用户的时候才能访问该方法。
- authentication:检查当前用户是否与指定的认证对象匹配。例如:@PreAuthorize(“#oauth2.hasScope(‘read’)”)表示只有当前用户具有 read 权限的时候才能访问该方法。
除了上述参数外,@PreAuthorize 注解还支持许多其他参数,例如 denyAll、permitAll、isAnonymous、isAuthenticated 等等。这些参数可以帮助开发人员更加灵活地定义访问控制规则。
在 @PreAuthorize 注解中,如果要使用自定义的 bean,需要在 bean 名称前加上 @ 符号。这是因为 @PreAuthorize 注解中的 SpEL 表达式会自动解析 @ 符号后面的字符串为 bean 名称,并将其作为 Spring 上下文中的 bean 进行处理。
例如,下面是一个使用自定义 bean 的 @PreAuthorize 注解的示例:
@PreAuthorize("@mySecurityService.checkSecurity(#account)")
public void deleteAccount(Account account) {
// 删除账户的代码
}
在上面的例子中,@mySecurityService 表示一个名为 mySecurityService 的 bean,它具有一个名为 checkSecurity 的方法,该方法接受一个 Account 对象作为参数,并返回一个布尔值。在使用 @PreAuthorize 注解的方法上,会调用 mySecurityService 的 checkSecurity 方法来检查当前用户是否有权限执行该方法。
需要注意的是,如果自定义 bean 的名称中包含特殊字符(例如 - 或 .),那么需要使用单引号将 bean 名称括起来,例如:@PreAuthorize(“@‘my-special-bean’.checkSecurity(#account)”)。这是因为 SpEL 表达式中这些字符有特殊的含义,需要使用单引号进行转义。