Spring常用注解详解
前言
荒废了三年,现在重新捡起Java,看了很多视频,为了避免“一看就会,一学就废”,就想着花点时间把这些知识整理整理,一是为了加深自己的学习记忆,二是给需要的猿友提供一份“百度编程”。 好了,废话不多说,直接进入正题吧~
1. @SpringBootApplication
、@EnableAutoConfiguration
、@ComponentScan
@SpringBootApplication
注解是SpringBoot的基石,创建SpringBoot工程之后会默认加在主类上。这个注解相当于@Configuration
、@EnableAutoConfigUration
、@ComponentScan
注解的集合。@EnableAutoConfiguration
启动SpringBoot的自动配置机制@ComponentScan
扫描被@Component(@Controller
、@Service
)注解的Bean,注解默认会扫描该类所在的包下所有类
2. Spring Bean
2.1 @Autowried
、 @Qualifier
@Autowried
注解是用于自动装配依赖关系,可以对类成员变量、方法、构造函数等进行标注,Spring会自动根据类型来解析和注入适当的Bean,如果存在多个相同类型的Bean,会引发歧义性,此时需要结合@Qualifier
注解来明确要注入的Bean。
注意:@Qualifier
只能搭配@Autowried
进行使用,不能单独使用!
2.1.1 单独使用@Autowried
@Service
private class UserService{...}
@Controller
private class UserController{
@Autowried
private UserService userService;
....
}
2.1.2 @Autowired
与@Qualifier
结合使用
private interface UserService{}
@Service
private class UserServiceImplA implements UserService{}
@Service
private class UserServiceImplB implements UserService{}
@Controller
private class UserController{
//此时UserService接口有两个实现类,那在注入时需要使用`@Qualifier`进行区分
@Autowried
@Qualifier("UserServiceImplA")
private UserService userServiceA;
@Autowried
@Qualifier("UserServiceImplB")
private UserService userServiceB;
}
2.1.3 题外话@Autowried
和@Resource
有什么区别
最近在面试的被问到最多的一个问题,正好也在这里记录一下
- 所属包不同
@Autowried
来自 org.springframework.beans.factory.annotation包@Resource
来自 javax.annotation.Resource包
- 注入方式不同
@Autowried
是按照类型自动装配,如果同一类型存在多个Bean,还可以结合@Qualifier
按Bean名称指定注入@Resource
可以通过名称和类型注入,默认先按照名称进行注入,如果找不到与名称匹配的Bean,再按照类型查找
- 对字段和方法的支持不同
@Autowried
用于成员变量、方法、构造函数@Resource
用于成员变量、方法
- 是否必须存在
@Autowried
注入的对象默认必须存在,如果不存在会抛出异常;但可以通过设置Required=false来解决@Resource
注入的对象如果不存在,不会抛出异常
2.2 @Component
、@Controller
、@Service
、@Respository
@Component
、@Controller
、@Service
、@Respository
都是用于将普通的Java类标识为Spring管理的组件(Bean)
但为了更好的业务区分,Spring提供了更具针对性的衍生注解:@Controller
(用于标识Web层的控制器组件) 、@Service
(用于标识服务层组件)、@Respository
(用于标识数据访问层组件),它们在功能上跟@Component
相同,但是会更清晰的标识了组件的角色和用途
2.3 @Controller
、@RestController
@Controller
- 用于标识一个类为控制器
- 当方法返回值是一个字符串时,通常需要结合
@ResponseBody
注解,将返回值转化为响应体,否则会被视为视图名称去寻找对应的视图页面
@RestController
@Controller
与@ResponseBody
的结合体- 方法返回值会直接作为HTTP响应体返回给前端,而不会被视为视图名称
2.4 @Configuration
允许在Spring上下文中注册额外的Bean或导入其它配置类,也可以用@Component
来代替,但使用@Configuration
更具有语义化。
在配置类中,使用@Bean来定义如何创建和配置Bean对象
2.5 @Scope
用于定义Spring Bean的作用域,常见的作用域包括
- singleton:单例,在整个spring容器中只创建一个实例;
- prototype:多例,每次获取该Bean时都会创建一个新的实例
- request:在一次HTTP请求中创建一个实例,该Bean仅在当前的Http request中有效
- session:在一个HTTP会话中创建一个实例,该Bean仅在当前的Http session中有效
3.处理HTTP请求
3.1 @RequestMapping
通用的请求注解,用于将一个方法映射到制定的HTTP请求���径和请求方法。
@RequestMapping(value = "/user", method = RequestMethod.GET)
@RequestMapping(value = "/user", method = RequestMethod.POST)
@RequestMapping(value = "/user", method = RequestMethod.PUT)
@RequestMapping(value = "/user", method = RequestMethod.DELETE)
@RequestMapping(value = "/user", method = RequestMethod.PATCH)
3.2 @GetMapping
用于处理HTTP GET请求,底层使用@RequestMapping(method=RequestMethod.GET)标记了用于处理GET请求。
3.3 @PostMapping
用于处理HTTP POST求,底层使用@RequestMapping(method=RequestMethod.POST)标记了用于处理GET请求。
3.4 @PutMapping
用于处理HTTP PUT请求,底层使用@RequestMapping(method=RequestMethod.PUT)标记了用于处理GET请求。
3.5 @DeleteMapping
用于处理HTTP DELETE请求,底层使用@RequestMapping(method=RequestMethod.DELETE)标记了用于处理GET请求。
3.6 @PatchMapping
PACTH请求通常用于对资源进行部分更新,与PUT请求(用于完整更新资源)不同,PATCH请求只需要包含更新的字段,而不是整个资源的表示。 用于处理HTTP PATCH请求,底层使用@RequestMapping(method=RequestMethod.PATCH)标记了用于处理GET请求。
4.前后端传值
4.1 @PathVariable
获取请求路径中的动态参数 例如:
@GetMapping("/user/{id}")"
public String getUserById(@PathVariable("id") Long userId){
return "userId="+userId;
}
4.2 @RequestParam
将请求中的参数绑定到方法的参数上 例如:
@GetMapping("/user")
public String getUser(@RequestParam("id") Long userId,@RequestParam("name") String name){
return "userId="+userId+"---"+"name="+name;
}
@RequestParam
中支持相关配置
- required:指定参数是否必须传递,默认为true,配置为false,则表示非必需传递且未传递时,该参数为null;
- defaultValue:当参数未传递时的默认值;
4.3 @RequestBody
用于处理POST、PUT等请求,当客户端以JSON、XML等格式讲数据传递到服务端时,使用@RequestBody
注解将这些数据转化为指定的java对象。
例如:
@PostMapping("/user")
public void createUser(@RequestBody User user){
...
}
5.参数校验
@NotNull
:用于确保字段值不为null
。@NotEmpty
:用于确保集合或字符串不为空(长度大于 0)。@NotBlank
:用于确保字符串不为空且至少包含一个非空白字符。@Size(min =, max = )
:用于检查集合或字符串的大小在指定的范围内。@Min(value = )
:用于确保数值类型字段的值不小于指定的值。@Max(value = )
:用于确保数值类型字段的值不大于指定的值。@Email
:用于校验字符串是否为有效的电子邮件格式。@Pattern(regexp = )
:用于根据指定的正则表达式模式校验字段值。@Positive
:确保数值为正数(大于 0)。@PositiveOrZero
:确保数值为正数或 0 。@Negative
:确保数值为负数(小于 0)。@NegativeOrZero
:确保数值为负数或 0 。@Digits(integer =, fraction = )
:限制数字的整数部分和小数部分的位数。@Future
:确保日期在未来。@FutureOrPresent
:确保日期在未来或当前。@Past
:确保日期在过去。@PastOrPresent
:确保日期在过去或当前。
6.事务
6.1 @Transactional
Spring中用于管理事务的注解,@Transactional
注解可用于方法和类上。
- 如果作用于类上,则类中所有的公共方法都将在事务中执行。
- 默认情况下,只有运行时异常会导致事务回滚,检查型异常不会导致事务回滚。(可以通过配置来改变)
@Transactional
注解相关配置项: - propagation:事务传播行为。
- REQUIRED(默认):如果当前没有事务,就创建一个事务;如果当前已经存在一个事务,则加入到该事务中。
- SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,就以非事务的方式执行。
- MANDATORY:必须在一个已存在的事务中执行,如果当前没有事务,就抛出异常。
- REQUIRES_NEW:总是创建一个新事务,如果当前存在事务,则将当前事务挂起。
- NO_SUPPORTS:以非事务的方式执行,如果当前存在事务,则将当前事务挂起。
- NEVER:以非事务的方式执行,若当前存在事务,则抛出异常。
- NESTED:如果当前存在事务,则在当前事务中嵌套一个子事务,子事务是一个独立的事务,但它依赖于外部事务。(如果外部事务回滚,则子事务也会回滚;如果子事务回滚,外部事务不会回滚)
- isolation:事务隔离级别
- DEFAULT:使用数据库默认的隔离级别
- READ_UNCOMMITTED:允许读取未提交的数据,可能导致脏读、不可重复读和幻读
- READ_COMMITTED:只能读取已提交的数据,可以避免脏读,但仍可能导致不可重复读和幻读
- REPEATABLE_READ:在一个事务中多次读取的数据是一致的,��以避免脏读和不可重复读,但仍可能出现幻读
- SERIALIZABLE:最严格的隔离级别,事务串行执行,可以避免脏读、不可重复读和幻读,但性能较差。
- timeout:事务超时时间
- readOnly:只读事务
- 默认是false,若设置成true,则表示该事务是只读的,有助于帮助数据库在处理事务时进行一些优化,因为它知道不会有写数据的操作。
- rollbackFor:指定事务回滚的异常类型
- 默认情况下只有运行时异常(RuntimeException及其子类)才能触发事务回滚,但可以通过配置,如rollbackFor=Exception.class来支持其它异常类型触发回滚
- noRollbackFor:不指定事务回滚的异常类型
7.JSON数据处理
7.1 @ResponseBody
将方法返回值直接作为HTTP响应的正文,并将其序列化为JSON格式发送给客户端。通常与@Controller或@RestController结合使用。
7.2 @JsonIgnoreProperties
在类上使用,用于过滤特定字段不返回或不解析,如
@JsonIgnoreProperties({"userRoles"})
public class User{
private Long id;
private String nickName;
private List<UserRole> userRoles;
}
7.3 @JsonIgnore
在类的属性上使用,用于过滤特定字段不返回或不解析
public class User{
private Long id;
private String nickName;
@JsonIgnore
private List<UserRole> userRoles;
}
7.4 @JsonFormat
用于格式化json数据,如:
@JsonFormat(shape=JsonFormat.Shape.STRING,pattern='yyyy-MM-dd',timezone='GMT')
private Date date;
7.5 @JsonUnwrapped
用于扁平化返回的数据,扁平化前:
public class User{
private Location location;
private UserInfo userInfo;
}
public class Location{
private String city;
private String county;
}
public class UserInfo{
private String username;
private String nickname;
}
{
"location":{
"city":"深圳",
"county":"南山区"
},
"userInfo":{
"username":"张三",
"nickname":"小张"
},
}
扁平化后:
public class User{
@JsonUnWrapped
private Location location;
@JsonUnWrapped
private UserInfo userInfo;
}
public class Location{
private String city;
private String county;
}
public class UserInfo{
private String username;
private String nickname;
}
{
"city":"深圳",
"county":"南山区",
"username":"张三",
"nickname":"小张"
}
8.测试相关
8.1 @SpringJUnitConfig
用于指定Spring测试的配置类
8.2 @RunWith(SpringRunner.class)
让测试运行于Spring的测试环境
8.3 @Transactional
声明测试方法的数据回滚,在该方法执行完毕之后,对数据库的操作会自动回滚,避免产生脏数据
转载自:https://juejin.cn/post/7389952503041572874