likes
comments
collection
share

Spring常用注解详解

作者站长头像
站长
· 阅读数 24

前言

荒废了三年,现在重新捡起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
评论
请登录