springboot 常用注解
收录了springboot的常用注解,持续更新中~~~
@ServletComponentScan
用法:
在SpringBootApplication上使用@ServletComponentScan注解后,
Servlet(控制器)、Filter(过滤器)、Listener(监听器)可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册到Spring容器中,无需其他代码。
实例:
在入口类中添加注解
@SpringBootApplication @ServletComponentScan public class RgcyiAdminApplication { public static void main(String[] args) { SpringApplication.run(RgcyiAdminApplication.class, args); } }
以配置过滤器为例:
==在需要配置的过滤器类方法类上添加@WebFilter注解==
格式:@WebFilter(filterName=“过滤器类名首字母小写”,urlPartten=“要拦截的路径
过滤器类继承Filter,并重写doFilter方法
@WebFilter(filterName=“拦截器类名首字母小写”,urlPartten=“要拦截的路径
/** * 过滤器配置类,用于检查用户是否登录 * */ @WebFilter(filterName = "loginFilter",urlPatterns = "/*") @Slf4j public class LoginFilter implements Filter { //路径匹配器,支持通配符 public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher(); @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //因为HttpServletRequest上是ServletRequest的子类,避免父类调用子类方法时父类没有该方法(多态) HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //1、获取本次请求的URI String requestURI = request.getRequestURI();// /backend/index.html log.info("拦截到请求:{}",requestURI); //定义不需要处理的请求路径 String[] urls = new String[]{ "/employee/login", "/employee/logout", "/backend/**", "/front/**", "/common/**", "/user/sendMsg", "/user/login" }; //2、判断本次请求是否需要处理 boolean check = check(urls, requestURI); //3、如果不需要处理,则直接放行 if(check){ log.info("放行的uml为{}", requestURI); filterChain.doFilter(request,response); return; } //4.1判断登录状态,如果已登录,则直接放行 //即判断登录时存入secsion的员工id是否存在 Long employeeId = (Long) request.getSession().getAttribute("employee"); System.out.println(employeeId); //isNull 为空返回true 否则返回false if (!Objects.isNull(employeeId)){ log.info("用户已登录,用户id为{}",employeeId); //通过工具类把员工用户id存入ThreadLocal BaseContext.setCurrentId(employeeId); //放行 filterChain.doFilter(request,response); return; } //5.如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据 log.info("用户未登录"); response.getWriter().write(JSON.toJSONString(new Result("用户未登录"))); return; } /** * 路径匹配,检查本次请求是否需要放行 * @param urls * @param requestURI * @return */ public boolean check(String[] urls,String requestURI){ for (String url : urls) { //正确则返回true否则返回false boolean match = PATH_MATCHER.match(url, requestURI); if(match){ return true; } } return false; } }
Spring Boot 中有许多常用的注解,这些注解用于配置、管理和定义 Spring Boot 应用程序的各个方面。以下是这些注解按大类和小类的方式分类,并附有解释和示例。
一、Spring Boot 核心注解
@SpringBootApplication
解释:这是一个组合注解,通常用于主应用程序类,标志着这是 Spring Boot 应用程序的入口点。它包含了其他注解,如@Configuration、@ComponentScan 和@EnableAutoConfiguration。
根据 SpringBoot 官网,这三个注解的作用分别是:
1、@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
2、@ComponentScan: 扫描被@Component (@Service,@Controller)注解的bean,注解默认会扫描该类所在的包下所有的类。
3、@Configuration:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
示例:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@Configuration
- 解释:标志着一个类作为配置类,它通常用于定义 Bean。
- 示例:
@Configuration
public class MyConfig {
@Beanpublic MyBean myBean() {
return new MyBean();
}
}
@ComponentScan
解释:用于指定 Spring 容器扫描组件的基本包路径。
示例:
@SpringBootApplication
@ComponentScan(basePackages = "com.example")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
二、Spring Boot Web 注解
@Controller
- 解释:标志着一个类是 Spring MVC 控制器,处理 HTTP 请求。
- 示例:
@Controller
public class MyController {
// Controller methods here
}
@RestController
解释:结合@Controller 和@ResponseBody,用于创建 RESTful 风格的控制器。 示例:
@RestController
public class MyRestController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
@RequestMapping
解释:用于映射 HTTP 请求到控制器方法,并指定 URL 路径。
示例:
@Controller
@RequestMapping("/my")
public class MyController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
三、 处理常见的 HTTP 请求类型
5 种常见的请求类型:
- GET :请求从服务器获取特定资源。举个例子:
GET /users
(获取所有学生) - POST :在服务器上创建一个新的资源。举个例子:
POST /users
(创建学生) - PUT :更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:
PUT /users/12
(更新编号为 12 的学生) - DELETE :从服务器删除特定的资源。举个例子:
DELETE /users/12
(删除编号为 12 的学生) - PATCH :更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少,这里就不举例子了。
3.1. GET 请求
@GetMapping("users")
等价于@RequestMapping(value="/users",method=RequestMethod.GET)
@GetMapping("/users")
public ResponseEntity<List<User>> getAllUsers() {
return userRepository.findAll();
}
3.2. POST 请求
@PostMapping("users")
等价于@RequestMapping(value="/users",method=RequestMethod.POST)
关于@RequestBody
注解的使用,在下面的“前后端传值”这块会讲到。
@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody UserCreateRequest userCreateRequest) {
return userRespository.save(user);
}
3.3. PUT 请求
@PutMapping("/users/{userId}")
等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
@PutMapping("/users/{userId}")
public ResponseEntity<User> updateUser(@PathVariable(value = "userId") Long userId,
@Valid @RequestBody UserUpdateRequest userUpdateRequest) {
......
}
3.4. DELETE 请求
@DeleteMapping("/users/{userId}")
等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)
@DeleteMapping("/users/{userId}")
public ResponseEntity deleteUser(@PathVariable(value = "userId") Long userId){
......
}
3.5. PATCH 请求
一般实际项目中,我们都是 PUT 不够用了之后才用 PATCH 请求去更新数据。
@PatchMapping("/profile")
public ResponseEntity updateStudent(@RequestBody StudentUpdateRequest studentUpdateRequest) {
studentRepository.updateDetail(studentUpdateRequest);
return ResponseEntity.ok().build();
}
四、 前后端传值
掌握前后端传值的正确姿势,是你开始 CRUD 的第一步!
4.1. @PathVariable
和 @RequestParam
@PathVariable
用于获取路径参数,@RequestParam
用于获取查询参数。
举个简单的例子:
代码解读
复制代码@GetMapping("/klasses/{klassId}/teachers")
public List<Teacher> getKlassRelatedTeachers(
@PathVariable("klassId") Long klassId,
@RequestParam(value = "type", required = false) String type ) {
...
}
如果我们请求的 url 是:/klasses/{123456}/teachers?type=web
那么我们服务获取到的数据就是:klassId=123456,type=web
。
4.2. @RequestBody
用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用HttpMessageConverter
或者自定义的HttpMessageConverter
将请求的 body 中的 json 字符串转换为 java 对象。
我用一个简单的例子来给演示一下基本使用!
我们有一个注册的接口:
@PostMapping("/sign-up")
public ResponseEntity signUp(@RequestBody @Valid UserRegisterRequest userRegisterRequest) {
userService.save(userRegisterRequest);
return ResponseEntity.ok().build();
}
UserRegisterRequest
对象:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRegisterRequest {
@NotBlank
private String userName;
@NotBlank
private String password;
@FullName
@NotBlank
private String fullName;
}
我们发送 post 请求到这个接口,并且 body 携带 JSON 数据:
{"userName":"coder","fullName":"shuangkou","password":"123456"}
这样我们的后端就可以直接把 json 格式的数据映射到我们的 UserRegisterRequest
类上。
👉 需要注意的是:一个请求方法只可以有一个@RequestBody,但是可以有多个@RequestParam和@PathVariable。 如果你的方法必须要用两个 @RequestBody
来接受数据的话,大概率是你的数据库设计或者系统设计出问题了!
五、Spring Boot Bean 注解
@Component
解释:标志着一个类是 Spring 的组件,会被 Spring 扫描并注册为一个 Bean。
示例:
@Component
public class MyComponent {
// Component logic here
}
@Service
解释:
用于标记一个类作为业务逻辑的服务组件。
示例:
@Service
public class MyService {
// Service logic here
}
@Repository
解释:
用于标记一个类作为数据访问组件,通常用于持久层。
示例:
@Repository
public class MyRepository {
// Repository logic here
}
@Controller
解释:用于标记一个类作为 Spring MVC 控制器。
示例:
@Controller
public class MyController {
// Controller logic here
}
@RestController
解释:结合@Controller 和@ResponseBody,用于创建 RESTful 风格的控制器。
示例:
@RestController
public class MyRestController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
@Configuration
解释:标志着一个类是 Spring 的配置类,通常用于定义 Bean。
示例:
@Configuration
public class MyConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
这些注解用于定义和管理 Spring Bean,是 Spring Boot 应用程序中的重要组成部分。每个注解都有不同的用途和上下文,你可以根据应用程序的需求使用适当的注解。在 Spring Boot 应用程序中,使用这些注解可以轻松创建和管理 Bean,而无需显式的 XML 配置。
六、Spring Boot 数据访问注解
@Repository
解释:标志着一个类是 Spring Data 仓库,用于数据库访问。
示例:
@Repository
public class UserRepository {
// Data access methods here
}
@Entity
解释:用于定义 JPA 实体类,映射到数据库表。
示例:
@Entity
public class User {
// Entity fields and methods here
}
七、Spring Boot 依赖注入注解
@Autowired
解释:用于自动装配 Bean,通常与构造函数、Setter 方法或字段一起使用。
示例:
@Service
public class MyService {
private final MyRepository repository;
@Autowired
public MyService(MyRepository repository) {
this.repository = repository;
}
}
@Qualifier
解释:与@Autowired 一起使用,用于指定要注入的 Bean 的名称。
示例:
@Service
public class MyService {
private final MyRepository repository;
@Autowired
public MyService(@Qualifier("myRepository") MyRepository repository) {
this.repository = repository;
}
}
八、参数校验
数据的校验的重要性就不用说了,即使在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。
JSR(Java Specification Requests) 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们 JavaBean 的属性上面,这样就可以在需要校验的时候进行校验了,非常方便!
校验的时候我们实际用的是 Hibernate Validator 框架。Hibernate Validator 是 Hibernate 团队最初的数据校验框架,Hibernate Validator 4.x 是 Bean Validation 1.0(JSR 303)的参考实现,Hibernate Validator 5.x 是 Bean Validation 1.1(JSR 349)的参考实现,目前最新版的 Hibernate Validator 6.x 是 Bean Validation 2.0(JSR 380)的参考实现。
SpringBoot 项目的 spring-boot-starter-web 依赖中已经有 hibernate-validator 包,不需要引用相关依赖。如下图所示(通过 idea 插件—Maven Helper 生成):
6.1 .一些常用的字段验证的注解
@NotEmpty
被注释的字符串的不能为 null 也不能为空@NotBlank
被注释的字符串非 null,并且必须包含一个非空白字符@Null
被注释的元素必须为 null@NotNull
被注释的元素必须不为 null@AssertTrue
被注释的元素必须为 true@AssertFalse
被注释的元素必须为 false@Pattern(regex=,flag=)
被注释的元素必须符合指定的正则表达式@Email
被注释的元素必须是 Email 格式。@Min(value)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(value)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值@DecimalMax(value)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值@Size(max=, min=)
被注释的元素的大小必须在指定的范围内@Digits (integer, fraction)
被注释的元素必须是一个数字,其值必须在可接受的范围内@Past
被注释的元素必须是一个过去的日期@Future
被注释的元素必须是一个将来的日期- ......
6.2. 验证请求体(RequestBody)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@NotNull(message = "classId 不能为空")
private String classId;
@Size(max = 33)
@NotNull(message = "name 不能为空")
private String name;
@Pattern(regexp = "((^Man$|^Woman$|^UGM$))", message = "sex 值不在可选范围")
@NotNull(message = "sex 不能为空")
private String sex;
@Email(message = "email 格式不正确")
@NotNull(message = "email 不能为空")
private String email;}
同时我们在需要验证的参数上加上@Valid
注解,如果验证失败,它将抛出MethodArgumentNotValidException
。
@RestController
@RequestMapping("/api")
public class PersonController {
@PostMapping("/person")
public ResponseEntity<Person> getPerson(@RequestBody @Valid Person person) {
return ResponseEntity.ok().body(person); }
}
6.3. 验证请求参数(Path Variables 和 Request Parameters)
一定一定不要忘记在类上加上 Validated 注解了,这个参数可以告诉 Spring 去校验方法参数。
@RestController
@RequestMapping("/api")
@Validated
public class PersonController {
@GetMapping("/person/{id}")
public ResponseEntity<Integer> getPersonByID(@Valid @PathVariable("id") @Max(value = 5,message = "超过 id 的范围了") Integer id)
{
return ResponseEntity.ok().body(id);
}
}
九、其他注解
@Value
- 解释:用于注入属性值,通常从配置文件中获取。
- 示例:
@Component
public class MyComponent {
@Value("${my.property}")
private String myProperty;
}
@ConfigurationProperties
解释:用于将配置属性绑定到一个 POJO 类,通常用于从配置文件中读取属性值。
示例:
@Configuration
@ConfigurationProperties(prefix = "my")
public class MyProperties {
private String property1;
private int property2;
// Getters and setters
}
参考文章:
Comments NOTHING