各框架下的常用注解

Spring框架注解

Spring框架主要解决了创建对象、管理对象的问题。
Spring的依赖项名称是spring-context

1.@Bean

添加在配置类中返回对象的方法上。使得Spring框架自动调用此方法,并管理此方法返回的对象放入容器

2.@Configuration

@Configuration可以作用在任意类上,表示该类是一个配置类,其实就相当于一个xml配置文件。在Spring框架中可以使用ApplicationContext直接加载,使类中的配置项生效,或在集成框架中,只要配置类在组件扫描范围内,此类中的配置项即可生效

3.@Component

通用组件注解,泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。当Spring执行组件扫描时,如果发现组件类,就会自动创建类的对象。

注意:组件类不应该是静态的,组件具有功能性。

4. @ComponentScan

用于指定组件扫描的包及其子孙包。包中的类如果添加了组件注解,则Spring执行组件扫描时会自动创建这些添加了组件注解的类的对象。

5.@Controller

组件注解,添加在控制器类上,是以Component为元注解的

6.@Service

组件注解,添加到业务类上,是以Component为元注解的

7.@Repository

组件注解,添加到数据访问类上,用于实例化对象,是以Component为元注解的。
为了避免idea误判,可添加在Mapper类上

8.@Scope

添加在组件类上,设置Spring对象的作用域。
singleton 单实例,全局有且仅有一个
prototype 多实例,每次获取Bean就有一个新的实例

由Spring管理的对象的作用域默认是单例的(并不是单例模式),对于同一个Bean,无论获取多少次,得到的都是同一个对象!如果希望某个被Spring管理的对象不是单例的,可以在类上添加@Scope("prototype")注解。

9.@Lazy

在单例的情况下,默认不是懒加载的,还可以通过@Lazy注解控制它是否为懒加载模式!所谓的懒加载,就是“不要逼不得已不创建对象”。

10.@Autowired

可以在类的属性、Setter方法、构造方法上添加@Autowired注解。
当添加在属性上,Spring会自动从容器中找到合适的对象为此属性注入值
当添加在Setter方法上或构造方法上,Spring会自动调用对应的方法

注意:
使用@Resource注解也可以实现自动装配(此注解是javax包中的),其装配机制是先尝试根据名称来装配,如果失败,再尝试根据类型装配!从执行效果上,一定程度可以等效于@Autowired

@Autowired@Resource的区别:
@Autowired:先根据类型,再根据名称
@Resource:先根据名称,再根据类型

@Autowired:可以注解属性、Setter方法、构造方法
@Resource:只能注解属性

@Autowired:由Spring提供
@Resource:由J2EE提供

面试题:

@Resource 和@Autowired 依赖注入的区别是什么?

  • @Resource
    • 只能放在属性上,表示先按照属性名匹配 IOC 容器中对象 id 给属性注入值
    • 若没有成功,会继续根据当前属性的类型匹配 IOC 容器中同类型对象来注入值
    • 若指定了 name 属性@Resource(name = “对象 id”),则只能按照对象 id 注入值。
  • @Autowird
    • 放在属性上:
      • 表示先按照类型给属性注入值
      • 如果 IOC 容器中存在多个与属性同类型的对象,则会按照属性名注入值.也可以配合@Qualifier(“IOC 容器中对象 id”)注解直接按照名称注入值。
    • 放在方法上:
      • 表示自动执行当前方法,如果方法有参数,会自动从 IOC 容器中寻找同类型的对象给参数传值,也可以在参数上添加@Qualifier(“IOC 容器中对象 id”)注解按照名称寻找对象给 参数传值。

11.@Qualifier

可以添加在属性、方法参数上,当使用@Autowired自动装配时,如果存在多个匹配类型的对象,且根据名称无法装配时,可以使用此注解指定名称

面试题:

@Qualifier 使用场 景是什么?

@Qualifier(“IOC 容器中对象 id”)可以配合@Autowird 一起使用, 表示根据指定
的 id 在 Spring 容器中匹配对象

12.@PropertySource

添加在配置类上,使用@PropertySource注解读取配置文件中的信息
举例:@PropertySource(“classpath:jdbc.properties”)
当Spring框架读取了配置文件中的信息后,会将这些读取到的数据封装在内置的Environment对象中,后续,任何需要这些配置信息的组件都可以从Environment中读取到配置的数据。

13. @Value

添加在属性或方法的参数上。主要用于配置读取Environment数据的表达式,使得Spring为属性、方法的参数注入值

    @Value("${spring.jdbc.url}")
    private String url;
    @Value("${spring.jdbc.driver}")
    private String driver;
    @Value("${spring.jdbc.username}")
    private String username;
    @Value("${spring.jdbc.password}")
    private String password;
    @Value("${spring.jdbc.init-size}")
    private int initSize;
    @Value("${spring.jdbc.max-active}")
    private int maxActive;

Spring MVC框架注解

Spring MVC是基于Spring框架基础之上的,主要解决了后端服务器接收客户端提交的请求,并给予响应的相关问题。

Spring MVC的依赖项spring-webmvc

1.@RequestMapping

作用就是映射URL路径,将http的请求地址映射到控制器(Controller)类的处理方法上,即配置请求路径处理请求的方法的映射关系。
@RequestMapping注解可以定义在控制器类上,也可以定义在类里面的方法上。

  • 定义在控制器类上:将http请求映射到该控制器上,规定初步的请求映射地址,相当于请求地址的父路径。在项目中,推荐为每一个控制器类都配置此注解,以指定请求路径的前缀。
  • 定义在处理请求的方法上:进一步指定到控制器处理方法的映射关系,如果在控制器类上没有定义@RequestMapping注解,则直接将请求地址映射到处理方法上。

Spring MVC框架还提供了@RequestMapping的相关注解,例如:

  • @GetMapping
    添加在处理请求的方法上,相当于@RequestMapping(method = RequestMethod.GET)
  • @PostMapping
    添加在处理请求的方法上,相当于@RequestMapping(method = RequestMethod.POST)
  • @PutMapping
    添加在处理请求的方法上,相当于@RequestMapping(method = RequestMethod.PUT)
  • @DeleteMapping
    添加在处理请求的方法上,相当于@RequestMapping(method = RequestMethod.DELETE)
  • 等等

这些注解就是已经限制了请求方式的注解。
@GetMapping为例,就限制了请求方式必须是GET,除此以外,使用方式与@RequestMapping完全相同!

2.@ResponseBody

添加在控制器类、处理请求的方法上。
当添加在处理请求的方法上,将方法的返回值,以特定的格式写入到response的响应正文区域,进而将数据返回给客户端。
当在控制器类上添加此注解,则类中所有处理请求的方法都将响应正文,当在控制器类中处理请求的方法上添加此注解,则此方法将响应正文。
此注解是@RestController@RestControllerAdvice的元注解

3.@RestController

添加在控制器类上。它同时具有@Controller@ResponseBody注解的效果,标记当前类是控制器类,且类中处理请求的方法均响应正文

4.@RequestParam

添加在处理请求的方法参数上,用于对传入的参数做一些限制。当有必要的情况下,可以在各参数的声明之前添加@RequestParam注解,其作用主要有:

  • 配置name属性:客户端将按照此配置的值提交请求参数,而不再是根据方法的参数名称来提交请求参数
  • 配置required属性:是否要求客户端必须提交此请求参数,默认为true,如果不提交,则出现400错误,当设置为false时,如果不提交,则服务器端将此参数值视为null
  • 配置defaultValue属性:配置此请求参数的默认值,当客户端没有提交此请求参数时,视为此值
@RequestMapping("/reg")
    public String reg(
    	@RequestParam(value="name",required=true,defaultValue="hello") String username){
        return "OK";
    }

需要注意,不要将@RequestParam添加在封装的类型之前。

5.@PathVariable

添加在处理请求的方法参数上。(用 户 从 url 路 径 上 获 取 指 定 参 数 , 标 注 在 参 数 前@PathVariabel(“要获取的参数名”)。)在RESTful风格的URL中,大多是包含了某些请求参数的值,在使用Spring MVC框架时,当需要设计这类URL时,可以使用{名称}进行占位,并在处理请求的方法的参数列表中,使用@PathVariable注解请求参数,即可将占位符的实际值注入到请求参数中!

// http://localhost:8080/springmvc01_war_exploded/user/888/info.do
@GetMapping("/{id}/info.do")
public UserVO info(@PathVariable Long id) {
    System.out.println("即将查询 id = " + id + " 的用户的信息……");
    UserVO userVO = new UserVO();
    userVO.setUsername("xxx");
    userVO.setPassword("123456789");
    return userVO;
}

6.@ExceptionHandler

添加在处理异常的方法上,表示该方法可以处理的异常类型。。

7.@ControllerAdvice

将处理异常的代码放在专门的类中,在此类上添加@ControllerAdvice注解。Spring MVC会在每次处理请求时按需调用此类中的方法,例如,处理请求时抛出异常,则会调用此类中处理异常的方法。

8.@RestControllerAdvice

由于目前主流的响应方式都是响应正文的,则可以将@ControllerAdvice替换为@RestControllerAdvice

9.@RequestBody

添加在处理请求的方法参数上。标记此参数是在请求体中获取的数据,可支持客户端通过JSON格式提交请求参数

补充:RequestBody与 ResponseBody的区别

  • @RequestBody的作用是将前端传来的json格式的数据转为自己定义好的javabean对象,需要写在方法的参数前,不能写在方法名上方
  • @ResponseBody的作用是将后端以return返回的javabean类型数据转为json类型数据,需要写在方法名上

10.@EnableWebMvc

Spring MVC的配置类。开启Spring MVC的增强模式,例如响应JSON格式的正文时需要开启,在Spring Boot中默认已开启,无需显式使用此注解

Mybatis框架注解

Mybatis的主要作用是快速实现对关系型数据库中的数据进行访问的框架。

Mybatis的依赖项:mybatis
Mybatis整合Spring的依赖项:mybatis-spring
Spring JDBC的依赖项:spring-jdbc
MySQL连接的依赖项:mysql-connector-java
数据库连接池的依赖项:commons-dbcp2

1.@Mapper

数据访问接口。用于Mybatis处理数据的接口都必须被Mybatis识别,其中一种做法是在每个接口上添加@Mapper注解,目的在于指定该接口是Mybatis需要创建代理对象的。
此注解不与@MapperScan同时使用!!!

2.@MapperScan

在配置类上添加@MapperScan注解,指定用于Mybatis处理数据的接口所在的根包,让用于Mybatis处理数据的接口都必须被Mybatis识别,使得Mybatis可以创建这些接口的代理对象

3.@Param

添加在方法参数前,作用在于当Mapper接口中抽象方法的参数超过1个时,应该添加此注解,用于配置参数名称,后续在SQL中#{}占位符中的名称就是此注解配置的名称

4.@Insert

添加到抽象方法上,配置Mapper接口中抽象方法映射的SQL语句

5.@Delete

添加到抽象方法上,配置Mapper接口中抽象方法映射的SQL语句

6.@Update

添加到抽象方法上,配置Mapper接口中抽象方法映射的SQL语句

7.@Select

添加到抽象方法上,配置Mapper接口中抽象方法映射的SQL语句

8.@Intercepts

Mybatis拦截器的相关注解
该注解用于配置当前拦截器作用于哪个方法

9.@Signature

Mybatis拦截器的相关注解
该注解表示一个方法的签名,这个签名就决定了这是一个什么方法

@Intercepts(@Signature(
     type = StatementHandler.class,
     method = "prepare",
     args = {Connection.class,Integer.class}
))

Spring Boot框架注解

Spring Boot框架主要解决了创建工程后需要进行繁琐的配置的问题,是一个“开箱即用”的框架,其核心思想是“约定大于配置”。

1.@SpringBootTest

@SpringBootTest添加在测试类上,标记此类是Spring Boot的测试类,会自动加载Spring的环境

2.@SpringBootApplication

添加在类上,标记此类是Spring Boot的应用程序类。在项目的启动类上有@SpringBootApplication注解,其元注解中有@SpringBootConfiguration,其元注解中有@Configuration,所以,启动类本身也是配置类。每个Spring Boot工程中只能有一个类添加此注解。

另外,@SpringBootApplication注解的元注解中还有@ComponentScan

3.@SpringBootConfiguration

添加在类上,标记此类是Spring Boot的配置类。

4.@AutoConfigureAfter

Spring Boot自动配置中的常用注解,它表示接下来要做自动配置,但是这个自动配置一定在谁之后做!

Knife4j – 在线API文档框架注解

1.@Api

是添加在控制器类上的注解,通过此注解的tags属性可以修改原本显示控制器类名称的位置的文本,通常,建议在配置的tags值上添加序号,例如:"1. 管理员模块""2. 商品模块",则框架会根据值进行排序

2.@ApiOperation

是添加在控制器类中处理请求的方法上的注解,用于配置此方法处理的请求在API文档中显示的文本

3.@ApiOperationSupport

是添加在控制器类中处理请求的方法上的注解,通过配置其order属性可以指定各方法在API文档中的显示顺序

4.@ApiModelProperty

是添加在POJO类的属性上的注解,用于对请求参数或响应结果中的某个属性进行说明,主要通过其value属性配置描述文本,并可通过example属性配置示例值,还可在响应结果时通过position属性指定顺序

5.@ApiImplicitParam

是添加在控制器类中处理请求的方法上的注解,也可以作为@ApiImplicitParams注解的参数值,主要用于配置非封装的参数,主要配置namevalueexamplerequireddataType属性

6.@ApiImplicitParams

是添加在控制器类中处理请求的方法上的注解,当方法有多个非封装的参数时,在方法上添加此注解,并在注解内部通过@ApiImplicitParam数组配置多个参数

提示:以上@ApiImplicitParams@ApiImplicitParam@ApiModelProperty可以组合使用。

JUnit注解

1.@Test

添加在测试方法前,标识此方法是一个JUnit测试方法

Spring Test注解

1.@Sql

当添加了spring-test依赖后,可以在测试时使用@Sql注解,以加载某些.sql脚本,使得测试之前或之后将执行这些脚本。

使用此注解主要是为了保障可以反复测试,并且得到预期的结果!例如执行删除的测试时,假设数据是存在的,第1次删除可以成功,但是在这之后的测试将不会成功,因为数据在第1次测试时就已经被删除!则可以编写一个.sql脚本,通过脚本向数据表中插入数据,并在每次测试之前执行此脚本,即可保证每次测试都是成功的!

此注解可以添加在测试类上,则对当前测试类的每个测试方法都是有效的。

此注解也可以添加在测试方法上,则只对当前测试方法是有效的。

如果测试类和测试方法上都添加了此注解,则仅测试方法上的注解会生效。

此注解除了配置需要执行的.sql脚本以外,还可以通过executionPhase属性配置其执行阶段,例如取值为Sql.ExecutionPhase.AFTER_TEST_METHOD时将使得.sql脚本会在测试方法之后被执行。

每个测试方法可以添加多个@Sql注解。

请添加图片描述

2.@SpringJUnitConfig

用于指定Spring的配置类。在编写测试时,可以在测试类上添加@SpringJUnitConfig注解,并在注解中配置Spring的配置类作为参数,则执行此类的任何测试方法之前,都会加载这些Spring配置类,并且,在编写测试时只要是在Spring容器中存在的对象,都可以自动装配

Lombok相关注解

1.@Data

添加在POJO类上,主要是为了简化编写POJO类,将在编译期干预,自动生成Setters & Getters,hashCode()、equals()、toString()

2.@Slf4j

日志文件注解,添加在类上。将在编译期干预,将声明并实例化一个名为log的变量,则在此类中可以使用log变量输出日志

3.@Accessors

添加在POJO类上,将Setters方法的返回值从void调整为返回当前对象
@Accessors(chain = true)开启链式开发
在这里插入图片描述在这里插入图片描述

javax相关注解

1.@PostConstruct

添加在组件类的方法上。Spring会在创建对象之后就执行初始化方法,需要在初始化方法的声明之前添加@PostConstruct注解

2.@PreDestroy

添加在组件类的方法上。Spring在销毁对象之前执行销毁方法,在销毁方法的声明之前添加@PreDestroy注解。

Spring JDBC相关注解

1.@Transactional

在基于Spring JDBC的编程中,当需要某个业务方法是事务性的,只需要在此方法的声明上添加@Transactional即可!

补充:

  • 事务是基于接口代理模式的,所以,@Transactional只针对接口中声明的方法是有效的
    • 例如,你在CategoryServiceImpl类中另外声明了某方法,此方法在ICategoryService上是没有的,则此方法上添加@Transactional也是无效的
  • 它是基于接口代理模式的,所以,内部调用时,被调用方法的@Transactional是无效的
    • 例如在接口中声明了a()b()这2个方法,均添加了@Transactional注解,且a()方法的内部调用了b()方法,则此次调用时,b()方法上的@Transactional是无效的
  • 默认情况下,将根据RuntimeException进行回滚(若没有进行以下配置,则遇到其他异常时不会回滚!)
    • 你也可以配置@Transactional注解的rollbackFor属性,则根据其它异常类型进行回滚,还可以配置noRollbackFor属性,指定出现某些异常时不回滚
  • 关于@Transcational注解,可以添加在接口上、接口中的抽象方法上、接口的实现类上、接口的实现类的重写的方法上,如果是添加在接口或实现类上,将使得接口中定义的所有方法都是事务性的,如果是添加接口中抽象方法上或接口的实现类重写的方法上,只会使得当前方法是事务性的,如果同时添加@Transcational注解,并配置了不同的参数,则以方法上的注解参数为准
    • 注意:强烈推荐将@Transational添加在接口上,或接口中的抽象方法上,而不添加在实现类上
  • 通常,某个业务方法中涉及1次以上的写操作(增、删、改操作,例如2次插入,或1次修改+1次删除,甚至2次插入+2次删除等),就必须使得此业务方法是事务性的
    • 其实,如果某个业务方法涉及多次查询,也可以是事务性的,则会使用同一个数据库连接,在多次查询时,会一定程度上提高查询效率

Validation相关注解

1.@NotNull

验证元素值必须不为 null

2.@Pattern

验证元素值符合正则表达式,认为 null 是有效的

3.@Range

限定数值的区间范围,默认最小值为0

4.@Min

限定数值大小范围的最小值

5.@Max

限定数值大小范围的最大值

6.@NotEmpty

验证字符串值不允许为“”(该注解不能加在非字符串的类型上!)

7.@NotBlank

验证元素值不为空白(该注解不能加在非字符串的类型上!)

8.@Valid

用于验证传入的参数变量是否符合要求,直接加在变量之前。在封装的对象中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息。

补充

  • 所属的包不同:

    • @Valid属于javax.validation包下,是jdk给提供的

    • @Validated是org.springframework.validation.annotation包下的,是spring提供的

  • @Validated要比@Valid更加强大:@Validated在@Valid之上提供了分组功能和验证排序功能

jackson databind 相关注解

1.@JsonSerialize

配置序列化器

2.@JsonDeserialize

配置反序列化器

 //配置LocalDateTimeSerializer的序列化器
@JsonSerialize(using = LocalDateTimeSerializer.class)
//配置LocalDateTimeDeserializer的反序列化器
@JsonDeserialize(using = LocalDateTimeDeserializer.class) 
private LocalDateTime gmtCreate; //数据创建时间

函数式接口相关注解

@FunctionalInterface

Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。

有且仅有一个抽象方法的接口叫做函数式接口,函数式接口可以被隐式转换为 Lambda 表达式。通常函数式接口上会添加@FunctionalInterface 注解。


版权声明:本文为L12131415L原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。