Springboot 常用注解

1. @SpringBootApplication 

这个是Springboot的最核心的注解,在Springboot创建的时候,自动加在主类上。用来开启Springboot的各项能力。

@SpringBootApplication
public class SimpleApplication {
  public static void main(String[] args) {
    SpringApplication.run(SimpleApplication.class, args);
  }
}

查看源码发现@SpringbootApplication是一个复合注解,他包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解

@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
}

@SpringbootConfiguration注解,继承@Configuration注解,主要用于加载配置类。两者的功能一致,标注当前类是配置类,将当前类内声明的一个或者多个以@Bean注解标记的方法的实例纳入到Spring容器中,并且实例名就是方法名。

@EnableAutoConfiguration注解,开启自动配置功能,将Springboot项目中符合@Configuration注解的配置类都加载到Springboot的IOC容器中。

@ComponentScan注解,主要用于组件扫描和自动装配,用来自动扫描被这些注解标识的类,最终生成ioc容器里的bean,默认扫描范围是@ComponentScan注解所在配置类包及子包的类。

2. Spring Bean 相关

2.1 @Autowired

@Autowired注解可以让Spring容器自动将符合类型的Bean对象注入到需要的属性,构造方法或方法参数中。通过@Autowired注解标记的属性,Spring容器在运行时,就会自动查找该属性所对应的Bean,并自动注入到该属性中,从而实现自动装配。

@Service
public class UserService {
  ......
}

@RestController
@RequestMapping("/users")
public class UserController {
   @Autowired
   private UserService userService;
   ......
}

2.2 @Component、@Service、@Controller、@Repository

我们一般使用@Autowired注解让SPring容器帮我们自动装配bean。被@Component,@Service,@Controller,@Repository注解标注的类,这些类会被纳入进spring容器中管理。

• @Component:通用注解,可标注任意类为Spring组件。如果一个Bean不知道属于哪个层,可以使用@Component注解标注。

• @Service:对应服务层。主要涉及一些复杂的逻辑。

• @Controller:对应控制层,主要接受用户请求并调用Service层返回数据给前端页面。

• @Reponsitory:对应持久层。主要用于数据库相关操作。

2.3. @RestController

@RestController注解是@Controller和@ResponseBody注解的合集,表示这是个控制器bean,并且将函数的返回值直接填入Http响应体中中,是Rest风格的控制器。

单独使用@Controller不加@ResponseBody的话一般使用在返回一个视图的情况,这种情况属于比较传统的Spring MVC应用,对应前后端 不分离的情况。@RestController返回JSON或者XML形式数据。

2.4 @Scope

该注解用于指定作用范围。经常搭配@Controller,@Service,@Repository,@Component,@Bean使用,修饰类

四种常见的SpringBean的作用域:

• singleton:唯一Bean实例

四种常见的 Spring Bean 的作用域:

  • singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
  • prototype : 每次请求都会创建一个新的 bean 实例。
  • request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
  • session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。

2.5. @Configuration

@Configuration注解一般用来声明配置类,可以使用@Component注解替代,不过使用@Configuration注解声明配置类更加规范。

@Configuration
public class AppConfig {
    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }

}

3. 常见的HTTP请求的注解

3.1 GET请求

Get请求一般使用@GetMapping("user")或者@RequestMapping(value="/user", method = RequestMethod.GET)

@GetMapping("/user")
// 或者 @RequestMapping(value="/user", method = RequestMethod.GET)
public ResultObj getAllUser() {
 return new ResultObj(userService.selectList());
}

3.2 POST请求

一般用于表单提交,使用@PostMapping("/userIns")注解或者@RequestMapping(value="/userIns", method = RequestMethod.POST)

@ResponseBody
@PostMapping("/userIns")
// 或者 @RequestMapping(value="/userIns", method = RequestMapping.POST)
public ResultObj insertUser(@Valid @RequestBody UserVo userVo) {
    userService.insert(userVo);
    return new ResultObj();
}

3.3 PUT请求

@PutMapping("/userInfo/{userId}")或者@RequestMapping(value="/userInfo/{userId}", method=RequestMethod.PUT)

@ResponseBody
@PutMapping("/userInfo/{userId}")
public ResultObj updateUser(@PathVariable(value = "userId") String userId, @Valid @requestBody UserVo userVo) {
    userService.updateUser(userVo);
    User user = userService.selectById(userId);
    return new ResultObj(userService.UpdateUser(user));
}

3.4 DELETE请求

@DeleteMapping("/deleteUser/{userId}")或者@Request(value="/deleteUser/{userId}", method=RequestMathod.DELETE)

@DeleteMapping("/deleteUser/{userId}")
public ResultObj deleteUser(@PathVariable(value = "userId") String userId){
    userService.deleteUser(userId);
    return new ResultObj();
}

4. 前后端传值

4.1 @ReuestParam和@PathVariable

@RequestParam注解用于获取查询参数,@PathVariable用于获取路径参数。

@ResponseBody
@RequestMapping("/agree/{userId}")
public ResultObj getUserInfo(
            @PathVariable("userId") String userId) {
    return ResultObj(userService.selectById(userId));        
}

@ResponseBody
@RequestMapping("/agree?userId=123")
public ResultObj getUserInfo(
            @RequestParam(value = "userId", required = false) String userId) {
    return ResultObj(userService.selectById(userId));        
}

4.2 @RequestBody

@RequestBody注解用于读取Request请求的body部分并且Content-Type为application/json格式的数据,接收到数据之后会自动将数据绑定到Java对象上去。系统会使用HttpMessageConverter或者自定义的HttpMessageConverter将请求的body中的json字符串转换为java对象。

@ResponseBody
@RequestMapping("/insUser")
public ResultObj insertUser(
            @RequestBody(required = false) UserVo userVo) {
    // userVo是一个Bean对象
    userService.insertUser(userVo);
    return new ResultObj();    
}

我们发送 post 请求到这个接口,并且 body 携带 JSON 数据:

{"userNmae":XXXX, "sex"="男".....}

一个请求方法只可以有一个@RequestBody, 但是可以有多个@RequestParam和@PathVariable。

5. 读取配置信息 

5.1 @Value

yml文件

username: XXXX                                                   

@Value("${username}")
private String userName;

5.2 @ConfigurationProperties

通过@ConfigurationProperties读取配置信息并和bean绑定。

yml文件

user: 

  userName: XXX

  userId: 123

@Data
@Component
@ConfigurationProperties(prefix = "user")
public clase UserProperties {
    private String userName;
    private String userId;
}

5.3 @PropertySource

@PropertySource注解读取指定的properties文件

@Configuration
@PropertySource("classpath:foo.properties")
public class PropertiesWithJavaConfig {
    //...
}

// 读取多个配置文件
@PropertySources({
    @PropertySource("classpath:foo.properties"),
    @PropertySource("classpath:bar.properties")
})
public class PropertiesWithJavaConfig {
    //...
}

6. 参数校验

数据校验很重要,即使在前端对数据已经进行校验的情况下,我们还是要多传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些HTTP工具直接向后端请求一些违法数据。

JSR(Java Specification Requests)是一套JavaBean参数校验的标准,他定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面,非常方便。校验的时候我们实际用的是Hibernate Validator框架。Springboot项目的spring-boot-starter-web依赖中已经有了hibernate-validator包,不需要医用祥光依赖。

需要注意的是,所有的校验注解,推荐使用JSR注解(javax.validation.constraints),而不是org.hibernate.validator.constraints

6.1 常用的字段校验注解

常见的注解
注解数据类型说明
@NotNull任意类型验证注解的元素值不是null
@Null任意类型验证注解的元素值是null
@AssertFalseBoolean,boolean验证注解的元素值是false
@AssertTrueBoolean,boolean验证注解的元素值是true
@Min(value=值)int,long,shot,BigDecimal,byte等任何number子类型验证注解的元素值大于等于指定的value值
@Max(value=值)和@Min一样验证注解的与那苏值小于等于指定的value值
@DecimalMin(value=值)和@Min一样验证注解的元素值大于等于指定的value值
@DecimalMax(value=值)和@Min一样验证注解的而元素值小于等于指定的value值
@Size(min=下限, max=上限)字符串,集合(Collection,Map,数组等)验证注解的元素值在min和max指定区间之内,如字符长度,集合大小
@PastDate,Calendar,Time日期类型验证注解的元素值(日期类型)比当前时间早
@Future和@Past一样验证注解的元素值(日期类型)比当前时间晚
@NotBlankCharSequence子类型验证注解的元素值不能为空(不能为null,且去除首尾的空格后长度不能为0)
@Length(min=下限, max=上限)CharSequence子类型验证注解的元素值长度在min和max之间
@NotEmptyCharSequence子类型,Collection,Map,数组验证注解的元素值不为null且不能为空(字符串的长度不能为0,集合大小不能为0)
@Range(min=最小值, max=最大值)int,long,short,BigDecimal,BigInteger等原子类型和包装类型验证注解的元素值在最小值和最大值之间
@EmailString验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式。
@Valid任何非原子类型指定递归验证的对象,如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可
@Posttive和@Min一样适用于数值并验证它们是正数
@PositiveOrZero和@Min一样适用于数值并验证他们是正数,包括0
@Negative和@Min一样适用于数值并验证它们是严格的负数
@NegativeOrZero和@Min一样适用于数值并验证它们是严格的负数,包括0
@PastOrPresentDate,Calendar,Time的日期类型验证日期值是过去,包括现在
@FutrueOrPresentDate,Calendar,Time的日期类型验证日期值是将来,包括现在

6.2 验证请求体(@RequestBody)

定义一个Bean

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserVo {

    @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;

}
@ResponseBody
@RequestMapping("/insUser")
public ResultObj insertUser(
            @RequestBody @Valid UserVo userVo) {
    userService.insertUser(userVo);
    return new ResultObj();    
}

6.3 验证请求参数(PathVariable和RequestParam)

@RestController
@Validated  // 一定要在类上加上Validated注解
public clase UserController {
    @ResponseBody
    @RequestMapping("/agree/{userId}")
    public ResultObj getUserInfo(
                @PathVariable("userId") @NotNull(message = "不能为空") String userId) {
        return ResultObj(userService.selectById(userId));        
    }
}

7. 全局处理Controllerceng异常

相关注解

  • @ControllerAdvice:定义全局异常处理类
  • @ExceptionHandler:声明异常处理方法
@Slf4j
@ControllerAdvice
public class ExceptionHandleServiceImpl implements ExceptionHandleService {

  @ExceptionHandler(RuntimeException.class)
  public ResultObj runtimeException(RuntimeException e) {
    log.info("运行时异常:{}", ExceptionUtil.getStackTraceInfo(e));
    return errorReturn(ErrorCode.SERVER_ERROR, e.getMessage());
  }
}

8. JPA相关

8.1 创建表

  • @Entity声明一个类对应一个数据库实体
  • @Table设置表名
@Data
@Entity
@Table(name = "role")
public class Role {

    private Long id;
    private String name;
    private String description;
}

8.2 创建主键

使用@Id声明之后,我们还需要定义主键的生成策略。我们可以使用@GeneratedValue指定主键生成策略

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

可以指定的策略

public enum GenerationType {

    /**
     * 使用一个特定的数据库表格来保存主键
     * 持久化引擎通过关系数据库的一张特定的表格来生成主键,
     */
    TABLE,

    /**
     *在某些数据库中,不支持主键自增长,比如Oracle、PostgreSQL其提供了一种叫做"序列(sequence)"的机制生成主键
     */
    SEQUENCE,

    /**
     * 主键自增长
     */
    IDENTITY,

    /**
     *把主键生成策略交给持久化引擎(persistence engine),
     *持久化引擎会根据数据库在以上三种主键生成 策略中选择其中一种
     */
    AUTO
}

8.3 设置字段类型

  • @Column声明字段
@Column(name = "user_name", nullable = false, length=32)
private String userName;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钟小猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值