Spring中常见的注解收集
文章目录
- Spring中常见的注解收集
- 1.@ResponseBody
- 2.@RequestBody
- 3.@RequestParam
- 4.@Controller
- 5.@RestController
- 6.@PathVariable
- 7.@RequestPart
- 8.@RequestHeader
- 9.@CookieValue
- 10.@ModelAttribute
- 11.@RequestMapping
- 12.@validated
- 13.@Value
- 14.@DateTimeFormat和@JsonFormat
- 15.@Bean
- 16.@AutoWire
- 17.@Lazy
- 18.@Component
- 19.@Scope
- 20.@Primary
- 21.@Configuration
- 22.@Service
- 23.@Repository
- 24.@PostConstruct和@PreDestroy
- 25.@ComponentScan
- 26.@CrossOrigin
- 27.@SpringBootTest和@RunWith(SpringRunner.class)和@Test
- 28.@SpringBootApplication
1.@ResponseBody
不管前端传来的方式是什么,如果要让后端的结果告知前端,并且是采用的json格式给前端,必须加上@ResponseBody注解,否则,前端接受不到结果,报404错。
2.@RequestBody
如果前端传给后端的是一个json格式的数据,后端接受,一定要加上@RequestBody,否则后端识别不了前端的json数据,会导致后端接受的所有参数值为null。
3.@RequestParam
前端给后端传数据是get或post方式,比如表单提交的多个数据,并不是json格式,当出现前端数据属性名和后端接受的数据属性名不一致时,使用@RequestParam注解取别名,使其成功映射。
4.@Controller
告诉spring框架,当前的@Controller下边的类是处理器(这里sping中处理器非常多,我们写的是后端控制器处理器),也就是我们日常写后端接口和前端对接的类。
5.@RestController
@RestController注解是@Controller注解和@ResponseBody注解的结合体,就是使用了该注解,后边后端返回给前端的数据是json格式,不用再加@ResponseBody注解,自动采用json格式给前端。
6.@PathVariable
Url路径参数注解@PathVariable一般用于restful风格传参的时候拿到路径参数,可以给路径参数取别名来保证前后端参数名不一致能成功映射。
7.@RequestPart
@RequestPart这个注解用在multipart/form-data表单提交请求的方法上。支持的请求方法的方式MultipartFile,属于Spring的MultipartResolver类。这个请求是通过http协议传输的。
与@RequestParam比较:@RequestParam也同样支持multipart/form-data请求。
他们最大的不同是,当请求方法的请求参数类型不再是String类型的时候,@RequestParam适用于name-valueString类型的请求域,@RequestPart适用于复杂的请求域(像JSON,XML)。
8.@RequestHeader
通过@RequestHeader注解拿到请求头的信息,比如想拿到内容的数据类型信息,使用@RequestHeader(name = “Content-Type”) String contentType就可获取。
9.@CookieValue
通过@CookieValue注解获取Cookie值,比如获取Cookie中sessionId信息,@CookieValue(name = “JSESSIONID”) String sessionId就可获取。
10.@ModelAttribute
在一个控制器(使用了@Controller
的Spring
组件)中,如果存在一到多个使用了@ModelAttribute
的方法,这些方法总是在进入控制器方法(方法上有@RequestMapping相关注解)之前执行,并且执行顺序是由加载顺序决定的(具体的顺序是带参数的优先,并且按照方法首字母升序排序)。
11.@RequestMapping
@RequestMapping注解是@GetMapping,@PostMapping,@PutMapping,@DeleteMapping等注解的结合体,也就是@RequestMapping可以替代上边所有注解,而具体使用那个注解的功能需要根据当前方法的参数相关信息,比如,前端以get方式传来参数,这时就相当于@GetMapping注解。
12.@validated
用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
使用举例:
@RequestMapping(value="/url.json",method= {RequestMethod.POST})
@ResponseBody
@Transactional
public Result<?> xxmethod( @RequestBody @Validated XoPO xoPo)
throws ParseException, UnsupportedEncodingException {}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
@data
public class XoPO{
@validated
private List<OrderPerson> personList;
@NotNull
@Size(max=32,message="code is null")
private String code;
@NotBlank
@Size(max=32,message="product is null")
private String product;
}
常用的检查类的注解类型
@AssertFalse 校验false
@AssertTrue 校验true
@DecimalMax(value=,inclusive=) 小于等于value,
inclusive=true,是小于等于
@DecimalMin(value=,inclusive=) 与上类似
@Max(value=) 小于等于value
@Min(value=) 大于等于value
@NotNull 检查Null
@Past 检查日期
@Pattern(regex=,flag=) 正则
@Size(min=, max=) 字符串,集合,map限制大小
@Validate 对po实体类进行校验
13.@Value
使用@Value注解可以拿到不是请求体中的数据源的数据,也就是说可以拿到上下文中已经加载和处理完成的环境属性值,比如拿到配置文件中的某个参数值,如文件上传,拿到配置文件中存储的路径信息。
14.@DateTimeFormat和@JsonFormat
这两个注解主要用于时间格式处理。
@DateTimeFormat注解配合
@RequestBody的参数使用的时候,会发现抛出
InvalidFormatException异常,提示转换失败,这是因为在处理此注解的时候,只支持
Form表单提交(
Content-Type为
x-www-form-urlencoded`)。
案例:
@PostMapping(value = "/date2")
public String date2(@RequestParam("name"="userId")String userId,
@RequestParam("name"="birthdayTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime birthdayTime,
@RequestParam("name"="graduationTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime graduationTime) {
return "success";
}
//或者先在实体类中给定时间格式规则
@Data
public class UserDto2 {
private String userId;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime birthdayTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime graduationTime;
}
@PostMapping(value = "/date2")
public String date2(UserDto2 userDto2) {
log.info(userDto2.toString());
return "success";
}
而@JsonFormat
注解可使用在Form
表单或者JSON
请求参数的场景,因此更推荐使用@JsonFormat
注解,不过注意需要指定时区(timezone
属性),可能出现时差。
案例:
@PostMapping(value = "/date2")
public String date2(@RequestBody UserDto2 userDto2) {
log.info(userDto2.toString());
return "success";
}
@Data
public class UserDto2 {
private String userId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime birthdayTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime graduationTime;
}
15.@Bean
@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
SpringIOC 容器管理一个或者多个bean,这些bean都需要在@Configuration注解下进行创建,在一个方法上使用@Bean注解就表明这个方法需要交给Spring进行管理。
16.@AutoWire
@AutoWire注解的方法表示自动装配的类型,返回一个Autowire
类型的枚举
Autowired 有两种 注入方式 by type 和by name , 默认使用的是byType的 方式 向Bean里面 注入 相应的Bean。
@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
17.@Lazy
表明一个bean 是否延迟加载,可以作用在方法上,表示这个方法被延迟加载;可以作用在@Component (或者由@Component 作为原注解) 注释的类上,表明这个类中所有的bean 都被延迟加载。如果没有@Lazy注释,或者@Lazy 被设置为false,那么该bean 就会急切渴望被加载;
18.@Component
@Component注解标注一个类为Spring容器的Bean,(把普通pojo实例化到spring容器中,相当于配置文件中的
19.@Scope
Scope | Descriptionn |
---|---|
singleton | 默认单例的bean定义信息,对于每个IOC容器来说都是单例对象 |
prototype | bean对象的定义为任意数量的对象实例 |
request | bean对象的定义为一次HTTP请求的生命周期,也就是说,每个HTTP请求都有自己的bean实例,它是在单个bean定义的后面创建的。仅仅在web-aware的上下文中有效 |
session | bean对象的定义为一次HTTP会话的生命周期。仅仅在web-aware的上下文中有效 |
application | bean对象的定义为WebSocket的生命周期内。仅仅在web-aware的上下文中有效 |
websocket | bean对象的定义为WebSocket的生命周期内。仅仅在web-aware的上下文中有效 |
20.@Primary
- 作用:指示当多个候选者有资格自动装配依赖项时,应优先考虑bean。
- 与@Bean 一起使用,定义在方法上,方法级别的注解
- 与@Component 一起使用,定义在类上,类级别的注解
案例:
@Configuration
public class AppConfigWithPrimary {
@Bean
public MyBean myBeanOne(){
return new MyBean();
}
@Bean
@Primary
public MyBean myBeanTwo(){
return new MyBean();
}
}
//上面代码定义了两个bean ,其中myBeanTwo 由@Primary 进行标注,表示它首先会进行注册
21.@Configuration
@Configuration注解是环境配置注解,告诉spring当前的类是一个环境配置类
22.@Service
@Service注解表示 service服务层(注入dao)
23.@Repository
@Repository注解表示dao层持久层
24.@PostConstruct和@PreDestroy
作用:方法初始化和销毁
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
加载的顺序:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rztiYS8E-1641530611951)(D:\typora_img_source\image-20220107121651751.png)]
案例:
//对象创建并赋值之后调用
@PostConstruct
public void init() {
System.out.println("对象创建并赋值之后调用...");
}
//容器移除对象之前
@PreDestroy
public void detory(){
System.out.println("容器移除对象之前执行...");
25.@ComponentScan
@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中
26.@CrossOrigin
当出现跨域问题,一般在Controller层的类上加@CrossOrigin跨域注解可以解决跨域。
27.@SpringBootTest和@RunWith(SpringRunner.class)和@Test
@SpringBootTest和@RunWith(SpringRunner.class)和@Test这三个注解都是单元测试注解,@RunWith(SpringRunner.class)注解告诉spring要加载配置文件,在容器中启动单元测试
28.@SpringBootApplication
@SpringBootApplication注解告诉spring这是一个项目启动入口类
上边的注解是我日常见到的注解,一些注解解释是借鉴的其他博主写的,后续会继续完善内容
参考:
深入理解spring注解之@ComponentScan注解 - 星朝 - 博客园 (cnblogs.com)
@Bean 注解全解析 - 程序员cxuan - 博客园 (cnblogs.com)
Spring注解之@validated的使用 - 山高我为峰 - 博客园 (cnblogs.com)
(50条消息) Spring 注解面面通 之 @RequestPart_键盘上流淌的日子-CSDN博客_requestpart注解