Spring常用注解全集

目录

前言:

一.Spring常用注解:

1.五大类注解:

2.@Scope注解:

3.关于Bean生命周期的注解:

4. Bean的注解注入:

5.@PropertySource注解:

6.@Bean注解:

7.@Import注解:

二.AOP常用注解:

1.@Aspect注解:

2.@Pointcut注解:

3.AOP通知注解:

4.@Order注解:

5.@annotation注解:

6.自定义注解必备的两个注解:

三.SpringBoot常用注解:

1.@Controller注解与@RestController注解:

2.@RequestMapping注解:

3.@RequestParam注解:

4.@RequestBody注解:

5.@PathVariable注解:

6.@RequestPart注解:

7.@CookieValue注解:

8.@SessionAttribute注解:

9.@RequestHeader注解:

10.Lombok相关注解:

(1)@Getter注解:

(2)@Setter注解:

(3)@ToString注解:

(4)@EqualsAndHashCode注解:

(5)@NoArgsConstructor注解:

(6)@AllArgsConstructor注解:

(7)@NonNull注解:

(8)@RequiredArgsConstructor注解:

(9)@Data注解:

11.@ConfigurationProperties注解:

12.@SpringBootApplication注解:

13.日志注解@slf4j:

14.@ExceptionHandler注解:

15.@ControllerAdvice注解:

16.@SpringBootTest注解:


前言:

本篇文章是总结Spring中常用的注解,并没有相关部分的原理总结等。

一.Spring常用注解:

1.五大类注解:

(1)@Controller——控制器层类注解,五大类注解的作用均一致,将类交给IOC管理,实现控制反转。

(2)@Service——服务器层类注解,作用跟@Controller一样,后面三个也一致,就不做过多赘述了。

(3)@Repository——仓库类注解。

(4)@Configuration——配置类注解。

(5)@Component——组件类注解。

五大类注解的作用是一样的,之所以有五个,只是用来区分当前类是负责业务中哪一块的。五大类注解是几乎所有注解生效的大前提。

五大类注解就相当于在xml文件中定义了一个<bean>标签,所以,五大类注解都有一个属性——"id",写法为“五大类注解名+("id名")”。

这里额外介绍一个注解——@ComponentScan。在有些视频或文档中。会说,在Spring框架中,注解必须通过配置类加该注解扫描对应类路径的形式才能被编译器加载,实际这并不是必须的,只是可以通过这种方式简化获取多个bean时的代码量,如果不用这个注解,就需要实例化多个容器,并在容器中指定对应的加载类的类名,如果有这个注解,就可以只实例化一个容器,从而取出多个bean,简化了代码量。( @ComponentScan的用法:@ComponentScan+(待加载的拥有注解的类对应的路径) )

2.@Scope注解:

@Scope注解用于调控当前Bean的作用域,例如,将当前Bean设置成单例模式或者是其它。对于Spring中的Bean,一共有六种作用域,分别是——singleton(Bean的默认作用域)、prototype、request、session、application、websocket。该注解的使用为 “@Scope +(六种作用域之一)”。接下来总结一下每种作用域的效果:

singleton——Spring 中默认的 Bean 作用域,它表示在整个应用程序中只存在一个 Bean 实例。每次请求该 Bean 时,都会返回同一个实例。

prototype——每次请求该 Bean 时都会创建一个新的实例。每个实例都有自己的属性值和状态,因此它们之间是相互独立的。

request——在一次 HTTP 请求中只存在一个 Bean 实例。在同一个请求中,多次请求该 Bean 时都会返回同一个实例。不同的请求之间,该 Bean 的实例是相互独立的。

session——在一个 HTTP Session 中只存在一个 Bean 实例。在同一个 Session 中,多次请求该 Bean 时都会返回同一个实例。不同的 Session 之间,该 Bean 的实例是相互独立的。

application——在一个 ServletContext 中只存在一个 Bean 实例。该作用域只在 SpringApplicationContext上下文中有效。

websocket——在一个 WebSocket 中只存在一个 Bean 实例。该作用域只在SpringApplicationContext上下文中有效。

3.关于Bean生命周期的注解:

关于Bean生命周期的注解有很多,这里仅列举出两个常用的,感兴趣的可以自行去Spring的官方文档中查找,同时还可以了解一下Bean的整个生命周期以及过程。

第一个是 @PostConstruct,表示当前方法是在构造方法后执行的(这里注意,这两个注解都是加载在方法上的),这个注解一般用在初始化方法上。

第二个是 @PreDestroy,表示当前方法是在Bean销毁前执行的,一般用于销毁方法。

Spring官方文档地址如下:

https://docs.spring.io/spring-framework/docs/5.3.x/reference/html/core.html#beans-factory-scopes

4. Bean的注解注入:

Bean注解注入有两个方法,分别是 @Autowired注解注入和 @Resource注解注入,将他们写到要注入对象上即可使用。这两个注解注入的本质区别在于,前者是由Spring提供的注解,而后者,则是由jdk本身提供的,后者的适配程度和泛用性,相较于前者都更好,因为@Autowired注解,在某些特殊情况下可能需要搭配 @Qualifier注解使用,用 @Qualifier注解来指明具体需要注入的对象的名称(@Resource注解本身就带有这个能力,只需在注解后加一个括号,里面指定好名字即可)。

除此之外,其实还有一个注解,也是注入用的,不过这个注解只能用于简单类型的注入,这个注解就是 @Value注解,在注解后的括号中直接放要注入的值即可,不过 @Value注解的真正用处并不是注入一个固定值,而是为了注入外部设置好的值,那么,此时就又需要用到一个新的注解了,就是 @PropertySource注解,这个注解的作用是——加载指定外部属性文件。只要在注解后的括号中指定外部属性文件的名称即可生效。那么,外部属性文件加载好了,该如何在 @Value注解中使用呢?答案就是,还是在注解后的括号中指定,不过这次的写法为 “@Value +("${属性文件中对应要注入的属性名}")”,到此,就完成了外部属性值的注入。

5.@PropertySource注解:

在上面总结 @Value注解时,已经粗略的提到了 @PropertySource注解的作用了,它就是用来加载指定外部属性文件的(Property文件)。具体的写法为 “@PropertySource +("外部属性文件名")”,那么,当外部属性文件有多个需要加载时,又该怎么做呢?其实还是老样子,@PropertySource注解也是支持数组形式的,所以,只需改成数组形式的写法即可 ——“@PropertySource +({"外部属性文件名",......,"外部属性文件名"})”。

6.@Bean注解:

当我们需要管理第三方bean时,可以使用@Bean注解进行管理,它可以将方法的返回值变成一个Bean,交给IOC容器来管理。它的使用也很简单,在要管理的方法(注意是方法)上添加一个@Bean即可。

既然完成了对第三方Bean的管理,就逃不开为第三方Bean进行依赖注入,那么,如何为第三方Bean进行依赖注入呢,答案有三种方法:

第一种,对于简单类型的注入,直接用 @Value注解即可。

第二种,对于引用类型来说,@Value注解已经做不到为他们进行注入了,这时候,我们上面所提到的@Autowired 和 @Resource注解就派上用场了,二者选其一就好,推荐使用 @Resource注解。

第三种,依旧是对引用类型来说的,这次什么注解都不用了,直接在形参中传入要注入的对象即可,当程序运行时,会自动为其进行注入,原因是因为扫描到了 @Bean注解。

7.@Import注解:

@Import注解的作用是导入其他的配置类到当前配置类中,使用这个注解即可实现一个配置类的统一管理。写法为 “@Import +(其他配置类名 + .class)”,当要导入的配置类有多个时,使用数组的形式传入即可(就是在括号里面加个大括号的形式)。

二.AOP常用注解:

1.@Aspect注解:

该注解的作用是,表明当前类是一个切面类是AOP必须有的注解。

2.@Pointcut注解:

该注解的作用是,定义切点,使用该注解可以进行切点的自定义。加载于方法上,用法为 “@Pointcut +("切点表达式")”。

3.AOP通知注解:

注意:AOP的通知注解均是加载于方法上的。

第一个,@Before:此注解表示当前方法是在目标方法执行前执行的。

第二个,@After:此注解表示当前方法是在目标方法执行后执行的,无论目标方法是否发生了异常,它都会执行。

第三个,@AfterReturning:此注解表示,当前方法仅在目标方法成功执行完后才执行,如果目标方法发生了异常则不会执行。

第四个,@AfterThrowing:此注解表示,当前方法仅在目标方法发生异常后执行。

第五个,@Around:此注解表示,当前方法在目标方法执行前和执行后都会执行一次,值得注意的是,当目标方法正常执行结束后,@Around的后置执行逻辑才会生效,如果目标方法因异常中断了,则不会执行后置逻辑。同时,由于 @Around 也会在目标方法执行前执行,和@Before一样,那么,这两个谁更优先执行呢?答案是,@Around的前置逻辑更优先,@Around的前置逻辑执行的优先级是优先于当前方法的所有逻辑的。

4.@Order注解:

上面说了单个方法时,每种通知之间的执行优先级,那么,当方法为多个时,又是那个方法的那个通知更优先呢?这时就可以使用一个注解来进行方法间优先级的指定,这个注解就是 @Order 注解,它的使用也很简单,只要在后面的括号中写入一个数字即可,这个数字越小,优先级就越高。(这里补充一下,当有多个方法时,不用@Order的话,默认会根据方法名来进行优先级排序。而每个方法中的通知的执行顺序跟上面通知中讲的依旧一致,只不过会先让其他方法中的高优先级的通知先执行,这一点,无论是否使用了@Order注解都不影响。)

5.@annotation注解:

@annotation注解是在切点表达式中使用的,跟常规的注解不同,它既不加载在类上,也不加载于方法上,而是在切点表达式中使用,它的作用是,根据注解进行匹配,表明当前方法仅在拥有这个注解的目标方法执行时执行。具体写法举例如下:6b71c86628ce4c1983857747971e9781.png

该注解一般搭配自定义注解使用,所以,接下来就会提到两个自定义注解必备的注解(只会提到两个,因为是必要的,其他的注解还有很多,但不是必要,并不常见,感兴趣可以去查找官方文档自行了解) 。

6.自定义注解必备的两个注解:

第一个是,@Target,表明注解所修饰的对象范围,即,该注解可以用在哪里。

第二个是,@Retention,表示注解被保留的时间长短,也就是注解的生命周期。

三.SpringBoot常用注解:

1.@Controller注解与@RestController注解:

前面提到,@Controller注解是五大类注解之一,其作用是,将当前类交给springIOC容器来管理,另一个作用是,表明当前类是属于控制层的,但在SpringBoot中,@Controller注解还有一个作用,就是表明当前类中方法的返回值都是以视图的方式进行返回的。而@RestController注解,单看名字,都有一个Controller,这就说明,二者是有共同之处的,不同的地方则在于前面的Rest,通过查看@RestController的源码可以知道,该注解是由@Controller注解和@ResponseBody注解共同实现的,@Controller注解是返回视图的作用,而这个@ResponseBody注解则是返回数据的作用,所以,@RestController注解的作用就是,表明当前类下的方法的返回值都将以数据的类型返回。因为随着前后端的分离,后端逐渐开始不在处理页面,就只需要返回给前端它所需要的数据即可。

2.@RequestMapping注解:

此注解是SpringBoot中极其重要的注解之一,他的作用是进行映射路径,我们可以在注解的参数中写入一个字符串,表明当前类或方法的访问路径。同时,他的参数也不止路径值这一个,还可以通过改变method来决定当前路径的访问方式是get还是post,也可以通过produce来改变方法或类的返回格式,对于一般的数据类型,默认是以html的格式进行返回的,通过改变produce,就可以让其以其他格式返回,如json格式,同时,produce参数还可以改变返回数据的编码格式,如utf8等。

3.@RequestParam注解:

参数重命名注解,通过该注解,可以使方法中的参数重命名,这样做的直接影响就是改变了访问路径中的key的名字,此时key的名字必须与注解重命名后的参数名保持一致,另一个值得注意的是,使用了该注解后,默认是必须传递这个key值的,不然就会报出异常,如果想要关闭这种默认情况,只需在注解的参数中加入一个required注解即可,并把他的值设成false,不然默认为true。

4.@RequestBody注解:

接收请求体参数注解,通过该注解,即可让后端接收到前端传递来的json字串,不过,值得注意的是,get请求无请求体,所以,使用该注解时,前端发起的请求一定要是post的,其次,在一个方法中,@RequestBody注解只能有一个。该注解可以与@RequestParam共同使用,并且,一个方法中可以有多个@RequestParam注解。

5.@PathVariable注解:

接收路径参数注解,该注解让参数可以直接接收访问路径参数,不过需要在映射路径时指定好要接收的部分,如:2391f07773e746d083531012afe64d30.png

上述代码即可实现接收路径参数的功能,不过,当有待传路径名与参数名不一致时,需要重新指定参数名,使其与待传参数名保持一致。

6.@RequestPart注解:

上传文件参数注解,通过该注解可以使参数能够接收到路径中传递过来的文件名,后续经过其他操作即可实现上传文件的操作。如,上传头像等。这里还有一点细节,就是,单纯要文件名的话,通过@RequestParam注解也可以实现,那么二者的区别在于什么呢?其实它们的本质区别只是在于参数类型的不同,当参数类型不再是String时,@RequestParam注解便不合适了,而@RequestPart注解则有更为广泛的参数域,可以接收的参数种类更多。

7.@CookieValue注解:

获取Cookie的参数注解,使用此注解可以获取到Cookie中的数据(注意,此注解只作用在参数上),有三个参数,四个key,其中,name跟value表示的意思一致,都表示给参数的重命名,两者也可同时使用,不过,此时要求两者值一致,同时,该注解也有required参数,默认值也是true,所以,当没有Cookie时也可能会报出异常,此时就需要手动设置required为false,最后,该注解有默认值,如果不想要默认值,可以将defaultValue参数手动设置为false,此时,required也会自动设置为false。通过这一点也就说明,即便我们不设置Cookie值,没有修改required和defaultValue参数,程序依旧不会因为这一点而报出异常。

8.@SessionAttribute注解:

获取Session的注解,此注解可以将对应数据保存在Session中,但是,需要注意的是,此注解只能作用在类上,同时,该注解有两个参数,分别是value和type,两者都可以写成数组形式,就是说可接收参数不仅限于一个,不过,两者都是数组,且同时使用时需要注意,type类型的顺序要和value的名字顺序保持一致,就是指,位置相对应的名字代表的数据类型必须与type里的一致,否则会出现异常。

9.@RequestHeader注解:

获取Header的注解,使用该注解可以获取到Header中的数据,不过,此注解跟@CookieValue注解一样,也是仅能作用于参数上,此外,参数也是一样的,所以,具体看@CookieValue注解即可。

10.Lombok相关注解:

(1)@Getter注解:

用于类的成员变量的注解,其作用是生成被注解标识的成员变量的get方法。

(2)@Setter注解:

跟@Getter注解一样,@Setter注解生成的是set方法。

(3)@ToString注解:

生成toString方法的参数。

(4)@EqualsAndHashCode注解:

生成equals和hashCode方法。

(5)@NoArgsConstructor注解:

自动添加无参构造方法。

(6)@AllArgsConstructor注解:

生成带有所有属性的构造方法,参数顺序跟定义顺序一致。

(7)@NonNull注解:

被标注的属性不能为null。

(8)@RequiredArgsConstructor注解:

自动添加必要属性的构造方法,必要属性为被@NonNull注解和final修饰的属性。

(9)@Data注解:

该注解为上述注解除@AllArgsConstructor注解和@NonNull注解之外的集合注解,包含他们的所有功能,是作用在类上的注解。

使用上述注解的前提为,必须导入Lombok相关依赖。

11.@ConfigurationProperties注解:

在上面IOC中,提到过一个依赖注入的注解,和这里的这个注解作用相似,不同的是,在SpringBoot中,有一个叫配置项的专属文件,该文件在SpringBoot中起到极其重要的作用,而在该配置项中,我们就可以定义一些常规配置和变量值等,而@ConfigurationProperties注解就是用来将配置项中的定义值注入给实体类中变量的注解。值得注意的是,这里提到的变量值并不是一个简单的单一变量,而是一个集合或者是一个map等复杂的类型,至于简单单一变量类型,用@Value注解即可。那么,该注解该如何使用呢,用法如下:

首先该注解是用于类的注解,其次,该注解有一个参数,叫做prefix,该参数用来指定要注入的配置项中的复杂类型的前缀名,最后一定要注意,指定的是前缀名而不是复杂类型的全程!

那么,又该怎么用@Value注解注入单一简单类型的配置项呢?这里要提到一下@Value的特殊用法,那就是通过("${简单类型配置项的名字}")的方式,这里需要注意,双引号中的$是一定不能去掉的,否则就会直接将双引号中的内容当作一个字符串直接赋值。

12.@SpringBootApplication注解:

SpringBoot的核心注解,凡是使用SpringBoot做项目,必定带有此注解,此注解是表示当前类是该SpringBoot项目的启动类,没有该注解就没有启动类,也就无法运行SpringBoot项目。

13.日志注解@slf4j:

在没有该注解的一般情况下,如果我们想要打印查看到程序日志时,我们一般会用LoggerFactory.getLogger的方式来获取指定类的日志信息,但如果我们有了@slf4j这个注解,就可以不用再定义Logger类了,可以直接通过log.的方式来拿取当前类的日志信息。

14.@ExceptionHandler注解:

该注解为异常管理注解,通过该注解即可完成对异常的统一管理,如统一抛出的异常信息等,不过需要注意的是,该注解下一定要定义一个处理异常的方法,也就是说,该注解只能代理处理异常的方法。此外,该注解也是有参数,但不是必传参数,该注解的参数为你要指定管理的异常类的类名,此时表示,该异常处理方法指定针对该类中的异常情况进行处理。

15.@ControllerAdvice注解:

该注解也是在SpringBoot项目中极其常用的一个注解,其学名为“Controller增强器”,含义可以理解为,使Controller控制器拥有统一管理的能力,大多数情况下会将该注解和@ExceptionHandler注解一起使用,使控制器实现统一异常管理的能力,但,它的真正能力远不止于此,感兴趣可以通过官方文档进行细致了解,很强大的一个注解,内容很多,这里就不细细地说了。

16.@SpringBootTest注解:

在SpringBoot项目中,我们经常会用到测试类,通过测试类来验证当前代码逻辑的正确性和运行效果,那么,想要使用测试类,及必须要有@SpringBootTest注解,该注解就表示当前类是一个SpringBoot项目的测试类,在测试类中,这个注解就像是@SpringBootApplication注解一样,也是必不可少的,但是只有这个注解还是不够的,我们还需要@Test注解,该注解用在测试方法上,和测试类注解搭配,即可实现测试方法的逻辑,执行当前被@Test注解代理的方法,即可进行测试。

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值