Java常用注解
Controller常用注解
@Controller
注解在类上。
定义了一个控制器类,并检测该方法是否使用了@RequestMapping注解处理Http请求。
@ResponseBody
注解在类或方法上。
在实际操作中我们只需要在Controller层使用@RequestBody注解就可以将对象进行反序列化;
而若需要对Controller的方法进行序列化,我们需要在返回值上使用@ResponseBody;
也可以将@ResponseBody注解在Controller类上,这样可以将这个类中所有的方法序列化。
@RestController
注解在类上。
1.@RestController 注解相当于 @ResponseBody + @Controller
2.@RestController为开发提供了方便,在提供json接口时需要的配置操作再也不需要自己配置了
3.@RestController注解时,返回的是内容实例
@RequestMapping
注解在类或方法上。
映射请求路径。
@GetMapping / @PostMapping
注解在方法上。
处理请求方法的GET/POST类型。
@RequestParam
注解在方法上。
将请求参数绑定到控制器的方法参数上。
@ControllerAdvice
注解在类上。
https://www.cnblogs.com/lenve/p/10748453.html
增强 Controller,可以实现三个方面的功能:
- 全局异常处理
在该类中,可以定义多个方法,不同的方法处理不同的异常,
@ExceptionHandler(Exception.class) 注解用来指明异常的处理类型 - 全局数据绑定
使用 @ModelAttribute 注解标记该方法的返回数据是一个全局数据,
默认情况下,这个全局数据的 key 就是返回的变量名,value 就是方法返回值,
当然开发者可以通过 @ModelAttribute 注解的 name 属性去重新指定 key。
定义完成后,在任何一个Controller 的接口中,都可以获取到这里定义的数据 - 全局数据预处理
1.给接口中的变量取别名
2.进行请求数据预处理
@InitBinder("b") 注解表示该方法用来处理和Book和相关的参数,在方法中,给参数添加一个 b 前缀,即请求参数要有b前缀.
3.发送请求
Dao常用注解
@Mapper
注解在类上
1:为了把mapper这个DAO交給Spring管理
http://412887952-qq-com.iteye.com/blog/2392672
2:为了不再写mapper映射文件
https://blog.csdn.net/phenomenonstell/article/details/79033144
3:为了给mapper接口 自动根据一个添加@Mapper注解的接口生成一个实现类http://www.tianshouzhi.com/api/tutorials/mapstruct/292
@Param
注解在变量上,@Param 是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=<参数数<=5时使用最佳。
@Primary
注解在方法上
自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Qualifier
注解在变量上
指定注入Bean的名称
@Async
注解在方法上
异步方法调用
MyBatis-Plus注解
@TableName
注解在类上
实体类对应的数据库表名
@TableId
注解在变量上
表主键标识
@TableField
注解在变量上
表字段标识
exist="是否存在,设置为true时表示该属性为数据库表字段。@TableName类字段默认为true,非数据库字段需要标识exist = false"
@TableLogic
注解在变量上
表字段逻辑删除标识
注入相关注解
@SpringBootApplication
注解在类上
表明启动类。@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan
@Component
注解在类上
把普通pojo实例化到spring容器中,相当于配置文件中的
@ComponentScan
注解在类上
@ComponentScan 主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中
@Autowired
注解在变量上
按照类型注入变量。
@Resource
注解在变量上
默认按照ByName自动注入变量。
@Autowired和@Resource两个注解的区别:
(1)@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
(2)@Autowired是Spring的注解,@Resource是J2EE的注解
@Value
注解在变量上
-
@Value(“${xxxx}”)注解从配置文件读取值的用法
@Value("${init.password}") private String initPwd;
-
@Value(“#{}”) 表示SpEl表达式通常用来获取bean的属性,或者调用bean的某个方法。当然还有可以表示常量
@Value("#{dataSource.url}") //获取bean的属性 private String jdbcUrl; @Value("#{'Spring Expression Language'}") //获取字符串常量 private String str; @Value("#{1}") private int number; //获取数字 1
@Configurable
注解在类上
@Configurable(preConstruction = true) 这个注解的作用是:告诉Spring在构造函数运行之前将依赖注入到对象中。使用该注解需要注意的地方:
- 需要在项目中添加如下jar包:aspectj-x.x.x.jar, aspectjrt.jar, aspectjveawer-x.x.x.jar
- 将基于Spring的java代理添加到运行配置中:-javaagent:"PATH\spring-instrument-x.x.x.jar"
@Configuration
注解在类上
从Spring3.0, @Configuration用于定义配置类,可替换xml配置文件, 被注解的类内部包含有一个或多个被@Bean注解的方法,
这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描, 并用于构建bean定义,
初始化Spring容器。
注意:@Configuration 注解的配置类有如下要求:
- @Configuration 不可以是final类型;
- @Configuration 不可以是匿名类;
- 嵌套的configuration必须是静态类。
@Bean
注解在方法上
产生一个Bean对象,然后这个Bean对象交给Spring管理产生这个Bean对象的方法Spring只会调用一次,
随后这个Spring将会将这个Bean对象放在自己的IOC容器中。需要在@Configuration注解下使用。
@EnableAutoConfiguration
注解在变量上
将外部的值动态注入到Bean中。
@Scope(value = "request")
注解在类或方法上
@Scope注解是springIoc容器中的一个作用域
在 Spring IoC 容器中具有以下几种作用域:
- 基本作用域singleton(单例)
- prototype(多例)
- Web 作用域(reqeust、session、globalsession)
- 自定义作用域
生命周期注解
@PostConstruct
注解在方法上
用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init())方法之前执行。
定时相关注解
@EnableScheduling
注解在类上
定时任务在配置类上添加@EnableScheduling开启对定时任务的支持,在相应的方法上添加@Scheduled声明需要执行的定时任务。
常见问题:https://www.cnblogs.com/domi22/p/9418433.html
a: 单线程任务丢失,转为异步线程池
b: 关于分布式情况下,重复执行的问题(两种方案)
1:可以使用redis的分布式锁保证spring schedule集群只执行一次。 r
edis分布式锁是通过setnx命令实现的。该命令的作用是,当往redis中存入一个值时,会先判断该值对应的key是否存在,
如果存在则返回0,如果不存在,则将该值存入redis并返回1。(但是在分布式跨时区部署的时候,依然无法避免重复执行)
2:可以通过使用shedlock将spring schedule上锁。详细见:https://segmentfault.com/a/1190000011975027
c: 服务器宕机之后,丢失的任务如何补偿?
可以将每次的任务执行时间缓在redis里,下次执行任务的时候都取出该时间,判断是否为上一个周期,
如果不是,可以计算出中间丢失的周期数,然后做响应的补偿操作。如果怕redis宕机,可以将“执行时间”持久化到表中。
@Scheduled(cron = "0 0 1 1/1 * ?")
缓存相关注解
@EnableCaching
注解在类上
@EnableCaching注解是spring framework中的注解驱动的缓存管理功能。自spring版本3.1起加入了该注解。如果你使用了这个注解,那么你就不需要在XML文件中配置cache manager了。
当你在配置类(@Configuration)上使用@EnableCaching注解时,会触发一个post processor,这会扫描每一个spring bean,查看是否已经存在注解对应的缓存。如果找到了,就会自动创建一个代理拦截方法调用,使用缓存的bean执行处理。
https://blog.csdn.net/dreamhai/article/details/80642010
@Cacheable
注解在类或方法上
当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。
对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。
Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略。
需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。@Cacheable可以指定三个属性,value、key和condition。
切面相关注解
@Aspect
注解在类上
标识该类为切面类
@Pointcut
注解在方法上
定义切点
如 @Pointcut("execution(* com.lanhuigu.spring.ConferenceServiceImpl.conference(..))")
格式: execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
修饰符匹配(modifier-pattern?)
返回值匹配(ret-type-pattern)可以为*表示任何返回值,全路径的类名等
类路径匹配(declaring-type-pattern?)
方法名匹配(name-pattern)可以指定方法名 或者 *代表所有, set* 代表以set开头的所有方法
参数匹配((param-pattern))可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用“*”来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(*,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(..)表示零个或多个任意参数
异常类型匹配(throws-pattern?)
其中后面跟着“?”的是可选项
比如:
1)execution(* *(..))
//表示匹配所有方法
2)execution(public * com.savage.service.UserService.*(..))
//表示匹配com.savage.server.UserService中所有的公有方法
3)execution(* com.savage.server..*.*(..))
//表示匹配com.savage.server包及其子包下的所有方法
通知类型
注解在方法上
@Before
前置通知,在目标方法被调用之前调用通知功能
@After
后置通知,在目标方法完成之后调用通知,不会关心方法的输出是什么。
@AfterReturning
返回通知,在目标方法成功执行之后调用通知
@AfterThrowing
异常通知,在目标方法抛出异常后调用通知
@Around
环绕通知,通知包裹了被通知的方法,在被通知的方法调用之前和之后执行自定义的行为
lombok注解
@Data
注解在类上
为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法
@Setter / @Getter
注解在类上
为相应的属性自动生成Getter/Setter方法
@Accessors
存取器,用于配置getter和setter方法的生成结果
fluent="流畅的,设置为true,则getter和setter方法的方法名都是基础属性名,且setter方法返回当前对象"
chain="链式的,设置为true,则setter方法返回当前对象"
prefix="前缀,用于生成getter和setter方法的字段名会忽视指定前缀(遵守驼峰命名)"
@Cleanup
注解在变量上
该注解能帮助我们自动调用数据流的close()方法,很大的简化了代码。
@AllArgsConstructor
注解在类上
使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数
@NoArgsConstructor
注解在类上
使用后创建一个无参构造函数
@Builder
注解在类上
用一个内部类去实例化一个对象,避免一个类出现过多构造函数
@EqualsAndHashCode
注解在类上
默认情况下,会使用所有非静态(non-static)和非瞬态(non-transient)属性来生成equals和hasCode,
也能通过exclude字段来排除一些属性。
@Log4j2
注解在类上
不需要定义Logger属性,即可输出日志文件
日志级别包含 debug,info,warn,error,fatal。
JDK注解
@Override
注解在方法上
表示重写父类方法,编译时期报错,提高可读性
@Deprecated
注解在方法上
表示方法已经过时
@SuppressWarnings
注解在类或方法或变量上
忽略指定的警告
参数校验注解
@Valid
注解在成员属性 / 构造函数 / 方法 / 方法参数上
用于校验参数,与实体类校验注解联合使用,否则实体类校验注解无效
@Validated
注解在类型 / 方法 / 方法参数上
用于校验参数,与实体类校验注解联合使用,否则实体类校验注解无效
@Validated和@Valid两个注解的区别:
(1)@Validated提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制
(2)注解位置不同
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。
(3)@Valid使用Hibernate Validation,@Validated对@Valid进行了二次封装,使用Spring Validator。
@NotNull
注解在类型 / 方法 / 方法参数 / 成员属性上
校验参数不为空,能帮助避免空指针
@NotEmpty
注解在类型 / 方法 / 方法参数 / 成员属性上
不能为null,而且长度必须大于0
@NotBlank
注解在类型 / 方法 / 方法参数 / 成员属性上
只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@Min / @DecimalMin / @Max / @DecimalMax
注解在类型 / 方法 / 方法参数 / 成员属性上
注解的变量必须是一个大于或等于 / 小于或等于 该值的数字
@Size(min=下限, max=上限)
注解在类型 / 方法 / 方法参数 / 成员属性上
验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小
@Length(min=下限, max=上限)
注解在类型 / 方法 / 方法参数 / 成员属性上
只能作用在String上,验证注解的元素值长度在min和max区间内
@Digits(integer=整数位数, fraction=小数位数)
注解在类型 / 方法 / 方法参数 / 成员属性上
验证注解的元素值的整数位数和小数位数上限
@Past / @Future
注解在类型 / 方法 / 方法参数 / 成员属性上
验证注解的元素值(日期类型)比当前时间早 / 晚
@AssertTrue / @AssertFalse
注解在类型 / 方法 / 方法参数 / 成员属性上
验证注解的元素值是true / false
Swagger注解
@Api
注解在类上
表示对类的说明,也代表了这个类是swagger2的资源
tags="说明该类的作用,参数是个数组,可以填多个"
value="该参数没什么意义,在UI界面上不显示,所以不用配置"
description = "用户基本信息操作"
@ApiOperation
注解在方法上
表示一个http请求访问该方法的操作
value="方法的用途和作用"
notes="方法的注意事项和备注"
tags="说明该方法的作用,参数是个数组,可以填多个"
格式:tags={"作用1","作用2"} //不建议使用这个参数,会使界面看上去有点乱,前两个常用
@ApiModel
注解在类上
用于说明实体作用
description="描述实体的作用"
@ApiProperty
注解在变量上
描述实体类的属性
value="用户名" 描述参数的意义
name="name" 参数的变量名
required=true 参数是否必选
@ApiParam
注解在变量上
表示对参数的要求和说明
name="参数名称"
value="参数的简要说明"
defaultValue="参数默认值"
required="true" //表示属性是否必填,默认为false
Gson注解
@SerializedName
注解在变量上
序列化 / 反序列化时的名称,解决了我们 Model 和 JSON 不对应的问题
@Expose
注解在变量上
对变量的序列化和反序列化单独控制
@Expose(serialize = false, deserialize = false)
serialize="字段是否参与序列化"
deserialize="字段是否参与反序列化"