上篇在这里:项目中常用的注解(上篇)
中篇在这里:项目中常用的注解(中篇)

1、lombok常用注解

lombok的注解用来操作实体类(javabean、entity、pojo、dto),可以少写很多代码。

(1)@Getter/@Setter

自动产生 getter/setter 方法

(2)@ToString

自动重写 toString() 方法,会印出所有变量

(3)@EqualsAndHashCode

自动生成 equals(Object other)hashcode() 方法,包括所有非静态变量和非 transient 的变量

如果某些变量不想要加进判断,可以透过 exclude 排除,也可以使用 of 指定某些字段

(4)@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

这三个很像,都是在自动生成该类的构造器,差别只在生成的构造器的参数不一样而已

@NoArgsConstructor : 生成一个没有参数的构造器

@AllArgsConstructor : 生成一个包含所有参数的构造器

@RequiredArgsConstructor : 生成一个包含 “特定参数” 的构造器,特定参数指的是那些有加上 final 修饰词的变量们

(5)@Data

整合包,只要加了 @Data 这个注解,等于同时加了以下注解

  • @Getter/@Setter
  • @ToString
  • @EqualsAndHashCode
  • @RequiredArgsConstructor

(6)@Value

也是整合包,但是他会把所有的变量都设成 final 的,其他的就跟 @Data 一样,等于同时加了以下注解

  • @Getter (注意没有setter)
  • @ToString
  • @EqualsAndHashCode
  • @RequiredArgsConstructor

(7)@Builder

自动生成流式 set 值写法

(8)@Slf4j

自动生成该类的 log 静态常量

除了 @Slf4j 之外,lombok 也提供其他日志框架的变种注解可以用,像是 @Log、@Log4j…等,他们都是帮我们创建一个静态常量 log,只是使用的库不一样而已.

SpringBoot默认支持的就是 slf4j + logback 的日志框架,所以也不用再多做啥设定,直接就可以用在 SpringBoot project上,log 系列注解最常用的就是 @Slf4j.

(9)补充注解:@Accessors

@Accessors 注解用来配置lombok如何产生和显示getters和setters的方法。
@Accessors有三个属性,分别是fluent,chain,prefix,@Accessors注解既可以注解在类上也可以注解在属性上

1.fluent
fluent为一个布尔值,如果为true,生成的get/set方法则没有set/get前缀,默认为false,例如:

@Accessors(flunet = true)
public class MyClass {
@Getter
private int num;
}
生成的get方法为num(),而不是getNum()

2.chain
chain为一个布尔值,如果为true,生成的set方法返回this;为false,生成的set方法是void类型。默认为false,除非当fluent为true时,chain默认则为true

3.prefix
prefix是一个string类型,生成get/set方法时会去掉指定的前缀,例如:

@Accessors(prefix = “m”)
public class MyClass {
@Getter
private int mNum;

}
生成的get方法为getNum(),而不是getMNum()。

2、其它注解

@Transactional注解

@Transactional的作用一个就是标识方法需要被代理,一个就是携带事务管理需要的一些属性信息。注解的实现涉及到 动态代理 和spring aop。

@Scheduled注解

概述

@Scheduled注解是spring boot提供的用于定时任务控制的注解,主要用于控制任务在某个指定时间执行,或者每隔一段时间执行.注意需要

配合@EnableScheduling使用,配置@Scheduled主要有四种配置执行时间的方式,cron,fixedRate,fixedDelay,initialDelay

cron

cron是@Scheduled的一个参数,是一个字符串,以5个空格隔开,只允许6个域(注意不是7个,7个直接会报错),分别表示秒,分,时,日,月,周.

示例:

@Scheduled(cron = "0 * * * 1 SAT") //每年的1月的所有周六的所有0秒时间执行@Scheduled(cron = "0 0 0 1 Jan ?") //每年的1月的1日的0时0分0秒执行

fixedRate

fixedRate表示自上一次执行时间之后多长时间执行,以ms为单位. 如

@Scheduled(fixedRate = 1000 * 5)

自上次执行之后5秒再执行.

fixedDelay

fixedDelay与fixedRate有点类似,不过fixedRate是上一次开始之后计时,fixedDelay是上一次结束之后计时,也就是说,fixedDelay表示上一次执行完毕之后多长时间执行,单位也是ms.

@Scheduled(fixedDelay = 1000 * 3600 * 12) //上一次执行完毕后半天后再次执行

initialDelay

initialDelay表示首次延迟多长时间后执行,单位ms,之后按照cron/fixedRate/fixedRateString/fixedDelay/fixedDelayString指定的规则执行,需要指定其中一个规则.

@Scheduled(initialDelay=1000,fixedRate=1000) //首次运行延迟1s

@MapperScan注解

1、@Mapper注解:
作用:在接口类上添加了@Mapper,在运行时通过动态代理会生成相应的接口实现类
添加位置:接口类上面

@Mapperpublic interface UserDAO {  //代码}

如果想要每个接口都要变成实现类,那么需要在每个接口类上加上@Mapper注解,比较麻烦,解决这个问题用@MapperScan

2、@MapperScan
作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
添加位置:在Springboot启动类上面添加,或在配置类上面添加。

@Indexed注解

概述:

SpringFramework5.0引入了一个注解@Indexed ,它可以为Spring的模式注解添加索引,以提升应用启动性能。

为什么要引入:

一些模式注解:

Spring注解场景说明
@Repository数据仓库模式注解
@Component通用组件模式注解
@Service服务模式注解
@ControllerWeb控制器模式注解
@Configuration配置类模式注解

在应用中有大量使用@ComponentScan扫描的package包含的类越多的时候,Spring模式注解解析耗时就越长。

原理:

在项目中使用了@Indexed之后,编译打包的时候会在项目中自动生成META-INT/spring.components文件。
当Spring应用上下文执行ComponentScan扫描时,META-INT/spring.components将会被CandidateComponentsIndexLoader 读取并加载,转换为CandidateComponentsIndex对象,这样的话@ComponentScan不在扫描指定的package,而是读取CandidateComponentsIndex对象,从而达到提升性能的目的。

@ExceptionHandler注解

作用

Spring的@ExceptionHandler可以用来统一处理方法抛出的异常。

使用方式

例如:

@ExceptionHandler(参数)public String handleExeption2(Exception ex) {    System.out.println("抛异常了:" + ex);    ex.printStackTrace();    String resultStr = "异常:默认";    return resultStr;}

当我们使用这个@ExceptionHandler注解时,我们需要定义一个异常的处理方法,比如上面的handleExeption2()方法,给这个方法加上@ExceptionHandler注解,这个方法就会处理类中其他方法(被@RequestMapping注解)抛出的异常;

而@ControllerAdvice注解是为控制器类做一些全局性的定制;

所以@ExceptionHandler注解结合@ControllerAdvice注解可以实现全局异常处理。

注解的参数

@ExceptionHandler注解中可以添加参数,参数是某个异常类的class,代表这个方法专门处理该类异常,比如这样:

@ExceptionHandler(NumberFormatException.class)public String handleExeption(Exception ex) {    System.out.println("抛异常了:" + ex);    ex.printStackTrace();    String resultStr = "异常:NumberFormatException";    return resultStr;}

此时注解的参数是NumberFormatException.class,表示只有方法抛出NumberFormatException时,才会调用该方法。

注解方法的返回值

标识了@ExceptionHandler注解的方法,返回值类型和标识了@RequestMapping的方法是统一的,可参见@RequestMapping的说明,比如默认返回Spring的ModelAndView对象,也可以返回String,这时的String是ModelAndView的路径,而不是字符串本身。

有些情况下我们会给标识了@RequestMapping的方法添加@ResponseBody,比如使用Ajax的场景,直接返回字符串,异常处理类也可以如此操作,添加@ResponseBody注解后,可以直接返回字符串,比如这样:

@ExceptionHandler(NumberFormatException.class)@ResponseBodypublic String handleExeption(Exception ex) {    System.out.println("抛异常了:" + ex);    ex.printStackTrace();    String resultStr = "异常:NumberFormatException";    return resultStr;}

这样的操作可以在执行完方法后直接返回字符串本身。

@ControllerAdvice注解

作用

为开发人员实现的控制器类做一些全局性的定制。

具体来讲,可作如下定制 :

结合@ExceptionHandler使用 ==> 添加统一的异常处理控制器方法
结合@ModelAttribute使用 ==> 使用共用方法添加渲染视图的数据模型属性
结合@InitBinder使用 ==> 使用共用方法初始化控制器方法调用使用的数据绑定器