SpringBoot框架常用注解+
SpringBoot框架常用注解
项目配置注解
注释 | 用途 |
---|---|
@SpringBootApplication | 是一个复合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解。 |
@Configuration | 一般用来声明配置类,可以使用 @Component注解替代,不过使用Configuration注解声明配置类更加语义化。 |
@SpringBootConfiguration | 标注当前类是配置类,这个注解继承自@Configuration。并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。 |
@ConditionalOnProperty | 在spring boot中有时候需要控制配置类是否生效,可以使用@ConditionalOnProperty注解来控制@Configuration是否生效。实现是通过havingValue与配置文件中的值对比,返回为true则配置类生效,反之失效 |
@EnableAutoConfiguration | 是自动配置的注解,这个注解会根据我们添加的组件jar来完成一些默认配置,我们做微服时会添加spring-boot-starter-web这个组件jar的pom依赖,这样配置会默认配置springmvc 和tomcat。 |
@ComponentScan | 扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。等价于context:component-scan的xml配置文件中的配置项。 |
@ServletComponentScan | Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,这样通过注解servlet ,拦截器,监听器的功能而无需其他配置 |
@MapperScan | spring-boot支持mybatis组件的一个注解,通过此注解指定mybatis接口类的路径,即可完成对mybatis接口的扫描。它和@mapper注解是一样的作用,不同的地方是扫描入口不一样。@mapper需要加在每一个mapper接口类上面。所以大多数情况下,都是在规划好工程目录之后,通过@MapperScan注解配置路径完成mapper接口的注入。 |
@ImportResource(locations={}) | 导入其他xml配置文件,需要标准在主配置类上。导入property的配置文件 |
@PropertySource | 指定文件路径,这个相当于使用spring的importresource标签来完成配置项的引入。 |
@import | 一个可以将普通类导入到spring容器中做管理 |
@component | 实现bean的注入 |
controller 层注解
注释 | 用途 |
---|---|
@Controller | 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。表明这个类是一个控制器类,和@RequestMapping来配合使用拦截请求,如果不在method中注明请求的方式,默认是拦截get和post请求。这样请求会完成后转向一个视图解析器。但是在大多微服务搭建的时候,前后端会做分离。所以请求后端只关注数据处理,后端返回json数据的话,需要配合@ResponseBody注解来完成。REST 风格的控制器 |
@RestController | @Controller 和@ResponseBody的结合,一个类被加上@RestController 注解,数据接口中就不再需要添加@ResponseBody。更加简洁。 |
@CrossOrigin(origins = “”, maxAge = 1000) | 这个注解主要是为了解决跨域访问的问题。这个注解可以为整个controller配置启用跨域,也可以在方法级别启用。我们在项目中使用这个注解是为了解决微服在做定时任务调度编排的时候,会访问不同的spider节点而出现跨域问题。 |
@Autowired | spring的自动装配,这个注解可以用到构造器,变量域,方法,注解类型上。当我们需要从bean 工厂中获取一个bean时,Spring会自动为我们装配该bean中标记为@Autowired的元素。 |
@EnableCaching | 这个注解是spring framework中的注解驱动的缓存管理功能。自spring版本3.1起加入了该注解。其作用相当于spring配置文件中的cache manager标签。 |
@PathVariable | 路径变量注解,@RequestMapping中用{}来定义url部分的变量名,同样可以支持变量名加正则表达式的方式,变量名:[正则表达式]。 |
@RequestParam | 用于获取查询参数 |
@RequestBody | 用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用HttpMessageConverter或者自定义的HttpMessageConverter将请求的 body 中的 json 字符串转换为 java 对象。(一个请求方法只可以有一个@RequestBody,但是可以有多个@RequestParam和@PathVariable。) |
servcie层注解
注解 | 用途 |
---|---|
@Service | 这个注解用来标记业务层的组件,我们会将业务逻辑处理的类都会加上这个注解交给spring容器。事务的切面也会配置在这一层。当然这个注解不是一定要用。有个泛指组件的注解,当我们不能确定具体作用的时候,可以用泛指组件的注解托付给spring容器。 |
@Resource | @Resource和@Autowired一样都可以用来装配bean,都可以标注字段上,或者方法上。 @resource注解不是spring提供的,是属于J2EE规范的注解。两个之间的区别就是匹配方式上有点不同,@Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配。 |
@ PostConstruct | 自定义初始化 |
@ PreDestroy | 自定义销毁 |
@Qualifier(“名称”) | 指定自动注入的id名称 |
持久层注解
注解 | 用途 |
---|---|
@Repository | @Repository注解类作为DAO对象,管理操作数据库的对象。总的来看,@Component, @Service, @Controller, @Repository是spring注解(标识成可用于 @Autowired 注解自动装配的 bean 的类),注解后可以被spring框架所扫描并注入到spring容器来进行管理。 |
@Component | 通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能。通过这些注解的分层管理,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。所以我们在正常开发中,如果能用@Service, @Controller, @Repository其中一个标注这个类的定位的时候,就不要用@Component来标注。 |
@Transactional | 通过这个注解可以声明事务,可以添加在类上或者方法上。在spring boot中 不用再单独配置事务管理,一般情况是我们会在servcie层添加了事务注解,即可开启事务。要注意的是,事务的开启只能在public 方法上。并且主要事务切面的回滚条件。正常我们配置rollbackfor exception时 ,如果在方法里捕获了异常就会导致事务切面配置的失效。 |
参数校验
注解 | 用途 |
---|---|
@NotEmpty | 被注释的字符串的不能为 null 也不能为空 |
@NotBlank | 被注释的字符串非 null,并且必须包含一个非空白字符 |
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Pattern(regex=,flag=) | 被注释的元素必须符合指定的正则表达式 |
被注释的元素必须是 Email 格式。 | |
@Min(value) | 注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max=, min=) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Valid | 验证请求体(RequestBody),在需要验证的参数上加上了@Valid注解,如果验证失败,它将抛出MethodArgumentNotValidException。 |
@Validated | 验证请求参数(Path Variables 和 Request Parameters),类上加上@ Validated 注解,参数前加@Valid注解 |
读取配置信息
注解 | 用途 |
---|---|
@value | 使用 @Value(“${property}”) 读取比较简单的配置信息 |
@ConfigurationProperties | 通过@ConfigurationProperties读取配置信息并与 bean 绑定。 |
@EnableConfigurationProperties | 使用 @ConfigurationProperties 注解的类生效。如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean。 |
PropertySource | 读取指定 properties 文件 |
json序列化
注解 | 用途 |
---|---|
@JsonFormat | 一般用来格式化 json 数据 |
@JsonIgnoreProperties | 作用在类上用于过滤掉特定字段不返回或者不解析。 |
@JsonIgnore | 一般用于类的属性上,作用和上面的@JsonIgnoreProperties 一样。 |
@JsonUnwrapped | 扁平化对象 |
@JsonInclude | 序列化时增加规则,例如@JsonInclude(JsonInclude.Include.NON_NULL)作用为序列化时过滤掉返回值为null的字段(不包括Optional或AtomicReference类型),其他规则还有ALWAYS(默认)->表示全部序列化,NON_ABSENT->Optional或AtomicReference类型实例为null和普通类型为null时不序列化,NON_EMPTY->排除字段值为null、空字符串、空集合、空数组、Optional类型引用为空,AtomicReference类型引用为空,NON_DEFAULT->没有更改的字段不序列化,CUSTOM->自定义,valueFilter属性一起使用,在序列化的时候会执行CustomFilter中的的equals方法,true为不会被序列化,USE_DEFAULTS->注解增加在类名上时,对整个类生效(优先级高于其他);也可增加在字段上,此时只对该字段生效 |
其他相关注解
注解 | 用途 |
---|---|
@RestControllerAdvice | @ControllerAdvice 和 @ResponseBody的合集,可以将异常以json的格式返回数据。 |
@ControllerAdvice | 注解定义全局异常处理类。@ControllerAdvice 和 @ExceptionHandler 配合完成统一异常拦截处理。 |
@ExceptionHandler | 注解声明异常处理方法 |
@Scope | 声明 Spring Bean 的作用域。四种常见的 Spring Bean 的作用域:singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的;prototype : 每次请求都会创建一个新的 bean 实例;request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效;session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。 |
@Test | 声明一个方法为测试方法 |
@ActiveProfiles | 一般作用于测试类上, 用于声明生效的 Spring 配置文件 |
@Transactional | 被声明的测试方法的数据会回滚,避免污染测试数据 |
@WithMockUser | Spring Security 提供的,用来模拟一个真实用户,并且可以赋予权限。 |
@Projection | 在interface接口前。这里的name属性是Projection的名字,types表示这个Projection只提供给Person类型的对象,在访问的时候也只能通过Person对象访问到这个Projection。 |
@UniqueConstraint | 定义在Table或SecondaryTable元数据里,用来指定建表时需要建唯一约束的列。 |
@RepositoryRestResource | 在rest类型的请求路径中自动截取people参数。补充;Spring Data REST的JSON输出格式使用的是HAL格式。 |
@FunctionalInterface | 标记在接口上,“函数式接口”是指仅仅只包含一个抽象方法的接口。该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。 |
@EventListener | 创建一个监听器,标注在一个bean的方法上 |
Java元注解
注解 | 用途 |
---|---|
@Target | 用于描述注解的使用范围 |
@Retention | 表示需要在什么级别保存该注释信息,用于描述注解的生命周期 |
@Documented | 描述在使用javadoc 工具为类生成帮助文档时是否要保留其注解信息 |
@Inherited | @Inherited 元注解只能应用于对类的注解。如果一个类具有继承注解,那么它的所有子类都自动具有同样的注解。 |
spring AOP常用注解
注解 | 用途 |
---|---|
@Aspect | 作用是把当前类标识为一个切面供容器读取 |
@Pointcut | Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。 |
@Around | 环绕增强,相当于MethodInterceptor |
@AfterReturning | 后置增强,相当于AfterReturningAdvice,方法正常退出时执行 |
@Before | 标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有下面几个 |
@AfterThrowing | 异常抛出增强,相当于ThrowsAdvice |
@After | final增强,不管是抛出异常或者正常退出都会执行 |
JPA 相关常用注解
注解 | 用途 |
---|---|
@Entity | 声明一个类对应一个数据库实体。 |
@Table(name = “”) | 设置表名 |
@Id | 声明一个字段为主键。 |
@GeneratedValue(strategy = GenerationType.IDENTITY) | 指定主键生成策略,默认使用的策略是GenerationType.AUTO。JPA 使用枚举定义了 4 种常见的主键生成策略:TABLE,使用一个特定的数据库表格来保存主键,持久化引擎通过关系数据库的一张特定的表格来生成主键;SEQUENCE,在某些数据库中,不支持主键自增长,比如Oracle、PostgreSQL其提供了一种叫做"序列(sequence)"的机制生成主键,IDENTITY,主键自增长;AUTO,把主键生成策略交给持久化引擎(persistence engine),持久化引擎会根据数据库在以上三种主键生成策略中选择其中一种。 |
@GenericGenerator | 声明一个主键策略。@GeneratedValue(generator = “IdentityIdGenerator”)@GenericGenerator(name = “IdentityIdGenerator”, strategy = “identity”)等价于@GeneratedValue(strategy = GenerationType.IDENTITY) |
@Column | 声明字段。设置属性 userName 对应的数据库字段名为 user_name,长度为 32,非空@Column(name = “user_name”, nullable = false, length=32)。设置字段类型并且加默认值Column(columnDefinition = “tinyint(1) default 1”)。columnDefinition 属性指定数据表对应的 Lob 字段类型@Column(name = “content”, columnDefinition = “LONGTEXT NOT NULL”) |
@Transient | 指定不持久化特定字段。声明不需要与数据库映射的字段,在保存的时候不需要保存进数据库 |
@Query | @Query(“select u.userName as userName ,u.email as email from User u”) |
@Lob | 声明某个字段为大字段。 |
@Basic(fetch = FetchType.EAGER) | 指定 Lob 类型数据的获取策略, FetchType.EAGER 表示非延迟 加载,而 FetchType. LAZY 表示延迟加载 |
@Enumerated | 使用枚举类型的字段@Enumerated(EnumType.STRING) |
@EnableJpaAuditing | 开启 JPA 审计功能 |
@CreatedDate | 表示该字段为创建时间时间字段,在这个实体被 insert 的时候,会设置。@LastModifiedDate同理 |
@CreatedBy | 表示该字段为创建人,在这个实体被 insert 的时候,会设置值。@LastModifiedBy同理 |
@Modifying | 提示 JPA 该操作是修改操作,注意还要配合@Transactional注解使用。 |
@Transactional | 在要开启事务的方法上使用@Transactional注解即可,一般用在可以作用在类或者方法上 |
@OneToOne | 声明一对一关系 |
@OneToMany | 声明一对多关系 |
@ManyToOne | 声明多对一关系 |
@MangToMang | 声明多对多关系 |
@JoinTable | 两张表通过中间的关联表做联系时使用,即多对多关系,见权限分配,中间表可以通过hibernate直接生成并保存 |
@JoinColumn | @JoinColumn(name=“addressID”)//注释本表中指向另一个表的外键。 |
@Temporal | 如果在某类中有Date类型的属性,数据库中存储可能是’yyyy-MM-dd hh:MM:ss’要在查询时获得年月日,在该属性上标注@Temporal(TemporalType.DATE) 会得到形如’yyyy-MM-dd’ 格式的日期;要获得时分秒,在该属性上标注 @Temporal(TemporalType.TIME) 会得到形如’HH:MM:SS’ 格式的日期;要获得’是’yyyy-MM-dd hh:MM:ss’,在该属性上标注 @Temporal(TemporalType.TIMESTAMP) 会得到形如’HH:MM:SS’ 格式的日期 |
rest
注解 | 用途 |
---|---|
@GetMapping(value =“”) | 等价于@RequestMapping(value=“”,method= RequestMethod.GET ) |
@PostMapping(value =“”) | 等价于@RequestMapping(value=“”,method = RequestMethod.POST) |
@PutMapping(value =“”) | 等价于@RequestMapping(value=“”,method = RequestMethod.PUT) |
@DeleteMapping(value =“”) | 等价于@RequestMapping(value=“”,method = RequestMethod.DELETE) |
@PatchMapping(“”) | 一般实际项目中,我们都是 PUT 不够用了之后才用 PATCH 请求去更新数据。 |
@PathParam | 获取 URL 请求中的路径参数 |
@QueryParam | 用于从请求 URL 的查询组件中提取查询参数 |
@DefaultValue | 如果需要为参数设置默认值,可以使用 @DefaultValue |
@FormParam | 顾名思义是处理 HTML表单请求的。要求所请求 MIME 媒体类型为 application/x-www-form-urlencoded,并且符合指定的 HTML 编码的形式,此参数提取对于 HTML 表单 POST 请求是非常有用的。 |
@MatrixParam | 从 URL 路径提取信息 |
@HeaderParam | 从 HTTP 头部提取信息 |
@CookieParam | 从关联在 HTTP 头部的 cookies 里提取信息 |
@BeanParam | 允许注入参数到一个 bean |
@Context | 一般可以用于获得一个Java类型关联请求或响应的上下文 |
Swagger常用注解
注解 | 用途 |
---|---|
@Api | 用在类上,说明该类的作用。 |
@ApiOperation | 注解来给API增加方法说明。 |
@ApiImplicitParams | 用在方法上包含一组参数说明。 |
@ApiImplicitParam | 用来注解来给方法入参增加说明。 |
@ApiResponses | 用于表示一组响应 |
@ApiResponse | 用在@ApiResponses中,一般用于表达一个错误的响应信息。code:数字,例如400;message:信息,例如"请求参数没填好";response:抛出异常的类 |
@ApiModel | 描述一个Model的信息(一般用在请求参数无法使用注解进行描述的时候) |
@ApiModelProperty | 描述一个model的属性 |
lombok常用注解
注解 | 用途 |
---|---|
@Data | 注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法。@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集 |
@Setter | 注解在类或属性上,为属性提供 set()方法,当注解在类上时为该类下所有属性提供set方法;@Setter(AccessLevel.PROTECTED)表示该方法是protected级别的,@Setter(AccessLevel.PRIVATE)表示该方法是private级别的,@Setter(AccessLevel.NONE)表示不会生成该方法;如果使用注解也手动写了方法,已重写的为准。static属性不会生成方法,final属性只会生成get方法 |
@Getter | 注解在类或属性上,为属性提供 get() 方法;使用同@Setter |
@ToString | 自动重写 toString() 方法,会印出所有变量 |
@EqualsAndHashCode | 自动生成 equals(Object other) 和 hashcode() 方法,包括所有非静态变量和非 transient 的变量。如果某些变量不想要加进判断,可以透过 exclude 排除,也可以使用 of 指定某些字段。@EqualsAndHashCode(callSuper = false)表示排除父类字段进行比较,只要子类对象的本身的字段值相同,父类字段值可以不同,equals方法的返回值是true。callSuper默认为false。(Q : 为什么只有一个整体的 @EqualsAndHashCode 注解,而不是分开的两个 @Equals 和 @HashCode?A : 在 Java 中有规定,当两个对象 equals 时,他们的 hashcode 一定要相同,反之,当 hashcode 相同时,对象不一定 equals。所以 equals 和 hashcode 要一起实现,免得发生违反 Java 规定的情形发生) |
@Slf4j | 自动生成该类的 log 静态常量,要打日志就可以直接打,不用再手动 new log 静态常量了(SpringBoot默认支持的就是 slf4j + logback 的日志框架)。 |
@Log4j | 注解在类上;为类提供一个 属性名为log 的 log4j 日志对象 |
@NoArgsConstructor | 注解在类上;为类提供一个无参的构造方法 |
@AllArgsConstructor | 注解在类上;为类提供一个全参的构造方法 |
@RequiredArgsConstructor | 生成一个包含 “特定参数” 的构造器,特定参数指的是那些有加上 final 修饰词的变量们 |
@Cleanup | 可以关闭流 |
@Builder | 自动生成流式 set 值写法,从此之后再也不用写一堆 setter 了。标注于类之上,用于生成复杂的builder API,创建构建者模式。还可用于标注于构造器和方法之上。 |
@Synchronized | 加个同步锁 |
@SneakyThrows | 等同于try/catch 捕获异常 |
@NonNull | 如果给参数加个这个注解 参数为null会抛出空指针异常 |
@Value | 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。 |
kafka
注解 | 用途 |
---|---|
1)通过@Configuration、@EnableKafka,声明Config并且打开KafkaTemplate能力。2)通过@Value注入application.properties配置文件中的kafka配置。3)生成bean,@Bean | |
@KafkaListener | topics属性用于指定kafka topic名称,topic名称由消息生产者指定,也就是由kafkaTemplate在发送消息时指定。 |
Spring Security常用注解
注解 | 用途 |
---|---|
@EnableGlobalMethodSecurity | Spring Security默认是禁用注解的,要想开启注解, 需要在继承WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解, 来判断用户对某个控制层的方法是否具有访问权限 (解释: 就是说有的@requestMapping方法被拥有指定权限的人访问 ) |
@preAuthorize | 用来控制一个方法是否能够被调用。在方法调用之前,基于表达式的计算结果来限制对方法的访问 |
@PostAuthorize | 与@preAuthorize两者可以用来在方法调用前或者调用后进行权限检查 |
@PreFilter | Spring Security将移除使对应表达式的结果为false的元素。代码表示将对返回结果中id不为偶数的user进行移除。filterObject是使用@PreFilter和@PostFilter时的一个内置表达式,表示集合中的当前对象。当@PreFilter标注的方法拥有多个集合类型的参数时,需要通过@PreFilter的filterTarget属性指定当前@PreFilter是针对哪个参数进行过滤的。 |
@PostFilter | 与@PreFilter用来对集合类型的参数或者返回值进行过滤 |
@RestResource | @RestResources仅在指向托管资源的域属性上受支持.因此,如果您没有通过Spring Data REST托管存储库公开WorkflowEvent,则注释无论如何都不会产生任何影响.在这种情况下,只需使用@JsonIgnore让杰克逊不渲染该属性. |
@EntityGraph | 通过@EntityGraph来指定实体类中定义的NamedEntityGraph |
以上内容参考了许多博客与其他类似文章 |
另: 内容未检查,可能有错误