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注解的参数值,主要用于配置非封装的参数,主要配置name、value、example、required、dataType属性
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 注解。