09_01_第七阶段:微服务开发||01-SpringBoot||00常用注解【观看狂神随笔】【lombok】

Spring Boot注解详解与最佳实践
本文详述了Spring Boot中常用的注解,包括@Component、@ConfigurationProperties、@Controller、@RestController、@Service、@Repository等,以及它们在不同层面上的作用。此外,还介绍了数据校验注解@Validated、自动装配的@Autowired与@Resource的区别,以及Swagger相关注解如@Api、@ApiOperation等。同时,提到了日志注解@Log的自定义和使用,以及如何通过@CurrentUser获取当前登录用户。

常用注解

###@Component(把普通pojo实例化到spring容器(组件)中,相当于配置文件中的 )——pojo下
  • 泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。

  • springboot-注解-@Repository、@Service、@Controller 和 @Component

  • Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。
    在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。——@Component不推荐使用。

  • ###@ConfigurationProperties(prefix = “yaml配置文件中的类名”)(用yaml配置文件绑定到任何java类上都可以)
    • 具体看04
    • 在这里插入图片描述
###@Controller 控制器(注入服务)
  • @RestController (就不用跳视图了—不用页面的跳转时候使用)

###RequestMapping(“/index”)【用于标注控制层,相当于struts中的action层,页面的跳转时候使用】

  • @GetMapping(用于处理请求方法的GET类型)

  • @ PostMapping(用于处理请求方法的POST类型等。)

###@Service 服务(注入dao)
  • 用于标注服务层,主要用来进行业务的逻辑处理
###@Repository(实现dao访问)
  • 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
@Value(给pojo中的的属性赋值)——pojo下的原生赋值方式【了解】
@Component
public class Dog {
    @Value("可乐")
    private String name;
    @Value("3")
    private Integer age;

  • 缺点,这样每个都要进行赋值,很麻烦_——所以一般用yaml
###@Autowired (它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。)
  • 通过 @Autowired的使用来消除 set ,get方法。
###@Validated(数据校验——开启这个验证支持才能使用如下的验证)
  • JSR303数据校验:这个就是我们可以在字段是增加一层过滤器验证,可以保证数据的合法性

  • 前提准备

    • 引入依赖

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-validation</artifactId>
      </dependency>
      
    • 在这里插入图片描述

@Configuration(表示这就是一个配置类)
@EnableConfigurationProperties(HttpProperties.class)(自动配置属性:HttpProperties)
@ConditionalOn(Spring的底层注解:根据不同的条件,来判断当前配置或者类是否生效)
  • 在这里插入图片描述
@Bean(明确地指示了一种方法,什么方法呢——产生一个bean的方法,并且**交给Spring容器管理**;)
  • @Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。

  • 是放在方法的注释

    • 因为它很明确地告诉被注释的方法,你给我产生一个Bean,然后交给Spring容器,剩下的你就别管了
@RequestParam(主要用于将请求参数区域的数据映射到控制层方法的参数上)
  • @RequestMapping("/user/login")
    @ResponseBody
    public String login(@RequestParam("username") String username, @RequestParam("password") String password){
    	return "ok";
    }
    
@ResponseBody(作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。)
  • 注:在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

@PathVariable(“id”)——(不加这个注解,前端传入的数值将接收不到)

  • /**
    \* @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)
    \* 不加@PathVariable(“id”) 前端传入的数值将接收不到,id默认为null
    \* 且不可用@Param 替代
    */
    

    Servlet是在ssm阶段用的,springboot不用了

@CurrentUser

  • 自定义获取当前登录用户的注解

@Autowired 与@Resource的区别(通俗易懂)

@Resource 由jdk提供

@Autowired 由spring提供

@Autowired//默认按type注入
@Qualifier(“cusInfoService”)//一般作为@Autowired()的修饰用,@Qualifier限定哪个bean应该被自动注入
@Resource(name=“cusInfoService”)//默认按name注入,可以通过name和type属性进行选择性注入

一般@Autowired和@Qualifier一起用,@Resource单独用。
原文链接
添加链接描述

——————————————————实体类entity中出现的注解

Lombok简介与使用

lombok几个基本注解的使用@Data@AllArgsConstructor@NoArgsConstructor@Builder

添加链接描述

@Column

@Column注解用来标识实体类中属性与数据表中字段的对应关系

(2)@Column属性详解:

name
定义了被标注字段在数据库表中所对应字段的名称;

unique
表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。

nullable
表示该字段是否可以为null值,默认为true

insertable
表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。

updatable
表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。

columnDefinition(大多数情况,几乎不用)
表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。)

table
表示当映射多个表时,指定表的表中的字段。默认值为主表的表名。

length
表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。

precision和scale
precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。

@ApiModelProperty

在swagger中@ApiModelProperty()注解一般用于方法,属性的说明,常用属性如下:
value–字段说明
name–重写属性名字
dataType–重写属性类型
required–是否必填
example–举例说明
hidden–隐藏

@Validated与@Valid注解&&&&@NotEmpty注解(验证参数上加注解)

@Validated与@Valid注解
@NotEmpty注解
前端传过来数据的时候,要进行校验,但是大量的校验很繁琐,会造成大量的if else语句的产生,所以@Valid和@Validated很好的解决了这个问题.

  • Validated分组验证
  • @Validated的使用

Bean验证中,@Length,@NotEmpty,@Pattern

1

@NotBlank、@NotNull、@NotEmpty三者之间的区别

1.@NotNull:不能为null,但可以为空字符串

2.@NotEmpty:不能为null,并且长度必须大于0

3.@NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
转载于:https://www.cnblogs.com/thinkjava/p/7073599.html

@Size、@Length、@Max、@Min注解的含义和区别

POM引入依赖:

		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>版本号</version>
		</dependency>

@Min 验证 NumberString 对象是否大等于指定的值

@Max 验证 NumberString 对象是否小等于指定的值

@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内

@Length(min=, max=) 验证字符串长度是否在给定的范围之内

max和min是对你填的“数字”是否大于或小于指定值,这个“数字”可以是number或者string类型
字符串长度限制用length

————————————————实体类
版权声明:本文为优快云博主「渡人既是渡己」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/kylin_tam/article/details/116276610

@JsonDeserialize 和 @JsonSerialize 基本使用

1

@DateTimeFormat与@JsonFormat详解

入参格式化

  • 这时,就可以使用 Spring 的 @DateTimeFormat 注解格式化参数
  • @DateTimeFormat
  • 主要解决前端时间控件传值到后台接收准确的Date类属性的问题

出参格式化

  • 调用接口的返回结果为:"date": "2018-08-01T14:25:31.296+0000"这个格式并不是我们想要的,那么如何将其进行格式化?这时就需要用到 jackson 的 @JsonFormat 注解
  • @JsonFormat
  • 主要解决后台从数据库中取出时间类型赋予java对象的Date属性值无法在前端以一定的日期格式来呈现
    1
    2

@Transient注解

@transient 就是在给某个javabean上需要添加个属性,但是这个属性你又不希望给存到数据库中去,仅仅是做个临时变量,用一下。不修改已经存在数据库的数据的数据结构。
1
2

———————————————————————数据访问层的实现类上

@repository(“数据访问层对应的接口”)

@Transactional

声明式事务管理编程中使用的注解
1

———————————————————————业务逻辑层的实现类上

@Autowired 与@Resource的区别

1
2

  • @Autowired和@Resource注解都是作为bean对象注入的时候使用的
  • 两者都可以声明在字段和setter方法上
    总结:

存在一个实现类都会注入进去,存在多个实现都会自动根据名称进行注入,只不过判断的先后顺序不同。

@Resource 由jdk提供

@Autowired 由spring提供

@Autowired//默认按type注入
@Qualifier(“cusInfoService”)//一般作为@Autowired()的修饰用
@Resource(name=“cusInfoService”)//默认按name注入,可以通过name和type属性进行选择性注入

一般@Autowired和@Qualifier一起用,@Resource单独用。

当然没有冲突的话@Autowired也可以单独用

———————————————————————表示层上

###@Controller 控制器(注入服务)
  • @RestController (就不用跳视图了—不用页面的跳转时候使用)

###RequestMapping(“/index”)【用于标注控制层,相当于struts中的action层,页面的跳转时候使用】

  • @GetMapping(用于处理请求方法的GET类型)

  • @ PostMapping(用于处理请求方法的POST类型等。)

@API

是用在类上,表明是swagger资源,
拥有两个属性:value、tags

注:生成的api文档会根据tags分类,即这个controller中的所有接口生成的接口文档都会在tags这个list下;tags如果有多个值,会生成多个list,每个list都显示所有接口
在这里插入图片描述

@ApiOperation

是用在方法上,表示一个http请求的操作
value用于方法描述
notes用于提示内容
tags可以重新分组
在这里插入图片描述

@ApiImplicitParam:一个请求参数&&@ApiImplicitParams:用于包含多个 @ApiImplicitParam

1

@PostMapping("/register")
@ApiOperation(value = "用户注册", notes = "APP用户注册")
@ApiImplicitParams({
        @ApiImplicitParam(name = "mobile", value = "手机号码", dataType = "string", paramType = "query", example = "13802780104", required = true),
        @ApiImplicitParam(name = "user_name", value = "登录账号", dataType = "string", paramType = "query", example = "lihailin9073", required = true),
        @ApiImplicitParam(name = "password", value = "登录密码", dataType = "string", paramType = "query", example = "123456", required = true),
        @ApiImplicitParam(name = "validate_code", value = "注册验证码", dataType = "string", paramType = "query", example = "3679", required = true)
})
public Object create() {
    Map<String,Object> map = new HashMap<>();
    map.put("list", null);
    return map;
}

各个参数说明:

  1. name :参数名。

  2. value : 参数的具体意义,作用。

  3. required : 参数是否必填。

  4. dataType :参数的数据类型。

  5. paramType :查询参数类型,这里有几种形式:

    path 以地址的形式提交数据
    query 直接跟参数完成自动映射赋值
    body 以流的形式提交 仅支持POST
    header 参数在request headers 里边提交
    form 以form表单的形式提交 仅支持POST

  • 被这个paramType坑过一次,在开发萌友智运APP的接口时,当发POST请求的时候,当时接受的整个参数,不论用body还是query,后台都会报Body Missing错误;这个参数和SpringMvc中的@RequestBody冲突,去掉paramType对接口测试并没有影响。

前后端参数传递总结(@RequestParam @RequestBody)

1
@RequestParam
作用:@RequestParam 常用来处理简单类型的绑定
影响:不使用@RequestParam注解时,前端请求参数携带与不携带都能正常访问接口,只是接收的参数值为空而已,相当于@RequestParam的required的值是false一样,而在使用@RequestParam注解且为未说明required的值是false的时候,前端请求就必须携带参数,不然直接报错
说明:这里的get和post方式将参数放入Params中都能进行访问
@RequestBody
作用:@RequestBody 适用于以POST为请求方式,请求参数以Json格式放在请求体中的前端请求,所以在使用@RequestBody接收数据时,一般都用POST方式进行提交,并将参数放以Json的格式放在请求体中。

两者特点:当然在后端接口中,@RequestBody与@RequestParam()可以同时使用,但得注意@RequestBody最多只能有一个,而@RequestParam()可以有多个

@ApiOperationSupport注解的使用

1
想要使用@ApiOperationSupport注解隐藏请求参数

  • 引入pom依赖
  • 在swaggerconfig中加@EnableKnife4j这个注解
  • 使用:在方法前直接使用该注解即可,注解中添加的参数就是需要请求时隐藏的参数

springboot中@Validated注解使用【配合实体类中@NotEmpty(),@Max等校验使用】

1
为什么使用@Validated

  • 前端传过来数据的时候,要进行校验,但是大量的校验很繁琐,会造成大量的if else语句的产生

@Validated的使用:

  1. 定义实体类,在要验证参数上加注解
    @Data
    public class Person {
        @NotEmpty(message = "姓名不能为空")
        private String name;
        @Max(value = 18,message = "年龄不能超过18岁")
        private String age;
        @Max(value = 1, message = "性别只能为0和1: 0=女1=男")
        @Min(value = 0, message = "性别只能为0和1: 0=女1=男")
        private Short sex;
    }
    
  2. 在接口参数省添加@Validated注解
    在这里插入图片描述

Validated分组验证看链接学习

———————————————————————Swagger的注解
在这里插入图片描述

@ApiImplicitParam注解【Swagger的注解】

添加链接描述

—————————————————————————扩展类中

自定义@CurrentUser注解,参数解析获取当前登录用户

java自定义一个获取当前登录用户的注解,如@CurrentUser,这样就不用每次request.getAttribute(“xxx”)这样获取了
1
2
3
使用到的两个枚举

ElementType枚举:
TYPE //接口、类、枚举
.FIELD //字段、枚举的常量
METHOD //方法
PARAMETER //方法参数
CONSTRUCTOR //构造函数
LOCAL_VARIABLE //局部变量
ANNOTATION_TYPE //注解
PACKAGE ///包

RetentionPolicy枚举:
SOURCE //注解在源码是有效,将被编译器丢弃
CLASS //注解在编译时有效,但在运行时没有保留。这也是默认行为
RUNTIME //运行时有效,并且可以通过反射获取

流程:

  1. 自定义注解
  2. 自定义一个类,然后实现实现方法参数解析器HandlerMethodArgumentResolver,将request获取到的用户信息返回给我们的@CurrentUser注解【参见package org.cloud.extension.resolver;】
  3. 注意:如果是SpringMVC项目,则需要将参数解析器注册到HandlerAdapter中【最后在spring-mvc.xml中添加一个参数解析器bean来初始化我们自定义的类】
  4. 于是我们就可以在我们的controller中使用我们获取当前用户的注解@CurrentUser了

在这里插入图片描述

—————————————————————————日志类中

@Log 自定义操作日志注解【如何自定义log注解,实现日志操作(切面编程)】

有的同学在工作学习时常常遇到这样一个需求,就是进行对日志表的增删改查。记录用户的操作。啊,有的小伙伴说:这还不简单,一顿操作猛如虎,在每个方法下面都写上了insert语句。
1
流程:

一、在你的代码中加入一个Log注解类

在这里插入图片描述

一、枚举类 BusinessType (功能.例如是新增还是修改)&&枚举类 OperatorType(操作人类别)

在这里插入图片描述

二、新建CustomLogAspect类(重要)

说明:下面这个类,可以完全复制。
a.注意logPointCut :切入点 。
b. handleLog:操作数据库。我这里记录的较详细。可根据您的需求进行增删。
在这里插入图片描述

三、写好上面的代码,您就可以在需要记录操作日志的方法上加上@Log注解,这样就可以对增加log日志啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

狂野小白兔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值