上篇在这里:项目中常用的注解(上篇)
中篇在这里:项目中常用的注解(中篇)
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 | 服务模式注解 |
@Controller | Web控制器模式注解 |
@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使用 ==> 使用共用方法初始化控制器方法调用使用的数据绑定器