SpringBoot常⽤注解总结
1. @SpringBootApplication
这⾥先单独拎出@SpringBootApplication注解说⼀下,虽然我们⼀般不会主动去使⽤它。
这个注解是 Spring Boot 项⽬的基⽯,创建 SpringBoot 项⽬之后会默认在主类加上。
@SpringBootApplication
public class SpringSecurityJwtGuideApplication {
public static void main(java.lang.String[] args) {
SpringApplication.run(SpringSecurityJwtGuideApplication.class, args);
}
}
我们可以把@SpringBootApplication看作是@Configuration、@EnableAutoConfiguration、@ComponentScan注解的集合。
package org.springframework.boot.autoconfigure;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
.
.....
}
package org.springframework.boot;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
根据 SpringBoot 官⽹,这三个注解的作⽤分别是:
@EnableAutoConfiguration:启⽤ SpringBoot 的⾃动配置机制
@ComponentScan:扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。
@Configuration:允许在 Spring 上下⽂中注册额外的 bean 或导⼊其他配置类
springmvc的注解有哪些2. Spring Bean 相关
2.1. @Autowired
⾃动导⼊对象到类中,被注⼊进的类同样要被 Spring 容器管理⽐如:Service 类注⼊到 Controller 类中。
@Service
public class UserService {
......
}
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
......
}
2.2. Component,@Repository,@Service, @Controller
我们⼀般使⽤@Autowired注解让 Spring 容器帮我们⾃动装配 bean。要想把类标识成可⽤于@Autowired注解⾃动装配的 bean 的类,可以采⽤以下注解实现:@Component:通⽤的注解,可标注任意类为Spring组件。如果⼀个 Bean 不知道属于哪个层,可以使⽤@Component注解标注。
@Repository : 对应持久层即 Dao 层,主要⽤于数据库相关操作。
@Service : 对应服务层,主要涉及⼀些复杂的逻辑,需要⽤到 Dao 层。
@Controller : 对应 Spring MVC 控制层,主要⽤户接受⽤户请求并调⽤ Service 层返回数据给前端页⾯。
2.3. @RestController
@RestController注解是@Controller和@ResponseBody的合集,表⽰这是个控制器 bean,并且是将函数的返回值直接填⼊ HTTP 响应体中,是 REST 风格的控制器。Guide 哥:现在都是前后端分离,说实话我已经很久没有⽤过@Controller。如果你的项⽬太⽼了的话,就当我没说。
单独使⽤@Controller不加@ResponseBody的话⼀般使⽤在要返回⼀个视图的情况,这种情况属于⽐较传统的 Spring MVC 的应⽤,对应于前后端不分离的情况。@Controller +@ResponseBody返回 JSON 或 XML 形式数据
关于@RestController和@Controller的对⽐,请看这篇⽂章:。
2.4. @Scope
声明 Spring Bean 的作⽤域,使⽤⽅法:
@Bean
@Scope("singleton")
public Person personSingleton() {
return new Person();
}
四种常见的 Spring Bean 的作⽤域:
singleton : 唯⼀ bean 实例,Spring 中的 bean 默认都是单例的。
prototype : 每次请求都会创建⼀个新的 bean 实例。
request : 每⼀次 HTTP 请求都会产⽣⼀个新的 bean,该 bean 仅在当前 HTTP request 内有效。
session : 每⼀次 HTTP 请求都会产⽣⼀个新的 bean,该 bean 仅在当前 HTTP session 内有效。
2.5. Configuration
⼀般⽤来声明配置类,可以使⽤@Component注解替代,不过使⽤Configuration注解声明配置类更加语义化。
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
3. 处理常见的 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();
}
4. 前后端传值
掌握前后端传值的正确姿势,是你开始 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来接受数据的话,⼤概率是你的数据库设计或者系统设计出问题了!
5. 读取配置信息
很多时候我们需要将⼀些常⽤的配置信息⽐如阿⾥云 oss、、认证的相关配置信息等等放到配置⽂件中。
下⾯我们来看⼀下 Spring 为我们提供了哪些⽅式帮助我们从配置⽂件中读取这些配置信息。
我们的数据源l内容如下::
wuhan2020: 2020年初武汉爆发了新型冠状病毒,疫情严重,但是,我相信⼀切都会过去!武汉加油!中国加油!
my-profile:
name: Guide哥
email: koushuangbwcx@163
library:
location: 湖北武汉加油中国加油
books:
- name: 天才基本法
description: ⼆⼗⼆岁的林朝⼣在⽗亲确诊阿尔茨海默病这天,得知⾃⼰暗恋多年的校园男神裴之即将出国深造的消息——对⽅考取的学校,恰是⽗亲当年为她放弃的那所。
- name: 时间的秩序
description: 为什么我们记得过去,⽽⾮未来?时间“流逝”意味着什么?是我们存在于时间之内,还是时间存在于我们之中?卡洛·罗韦利⽤诗意的⽂字,邀请我们思考这⼀亘古难题——时间的本质。    - name: 了不起的我
description: 如何养成⼀个新习惯?如何让⼼智变得更成熟?如何拥有⾼质量的关系?如何⾛出⼈⽣的艰难时刻?
5.1. @value(常⽤)
使⽤@Value("${property}")读取⽐较简单的配置信息:
@Value("${wuhan2020}")
String wuhan2020;
5.2. @ConfigurationProperties(常⽤)
通过@ConfigurationProperties读取配置信息并与 bean 绑定。
@Component
@ConfigurationProperties(prefix = "library")
class LibraryProperties {
@NotEmpty
private String location;
private List<Book> books;
@Setter
@Getter
@ToString
static class Book {
String name;
String description;
}
省略getter/setter
......
}
你可以像使⽤普通的 Spring bean ⼀样,将其注⼊到类中使⽤。
5.3. PropertySource(不常⽤)
@PropertySource读取指定 properties ⽂件
@Component
@PropertySource("classpath:website.properties")
class WebSite {
@Value("${url}")
private String url;
省略getter/setter
......
}
更多内容请查看我的这篇⽂章:《》。
6. 参数校验
数据的校验的重要性就不⽤说了,即使在前端对数据进⾏校验的情况下,我们还是要对传⼊后端的数据再进⾏⼀遍校验,避免⽤户绕过浏览器直接通过⼀些 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 ⽣成):
⾮ SpringBoot 项⽬需要⾃⾏引⼊相关依赖包,这⾥不多做讲解,具体可以查看我的这篇⽂章:《》。
需要注意的是:所有的注解,推荐使⽤ JSR 注解,即straints,⽽不是org.straints 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;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。