产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

springboot 之常用注解

  • 2020-02-11
  • 本文字数:3075 字

    阅读完需:约 10 分钟

springboot 之常用注解

在 spring boot 中,摒弃了 spring 以往项目中大量繁琐的配置,遵循约定大于配置的原则,通过自身默认配置,极大的降低了项目搭建的复杂度。同样在 spring boot 中,大量注解的使用,使得代码看起来更加简洁,提高开发的效率。这些注解不光包括 spring boot 自有,也有一些是继承自 spring 的。


本文中将 spring boot 项目中常用的一些核心注解归类总结,并结合实际使用的角度来解释其作用。


项目配置注解****




1、@SpringBootApplication 注解


查看源码可发现,@SpringBootApplication 是一个复合注解,包含了 @SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan 这三个注解。


这三个注解的作用分别为:


  • @SpringBootConfiguration:标注当前类是配置类,这个注解继承自 @Configuration。并会将当前类内声明的一个或多个以 @Bean 注解标记的方法的实例纳入到 srping 容器中,并且实例名就是方法名。

  • @EnableAutoConfiguration:是自动配置的注解,这个注解会根据我们添加的组件 jar 来完成一些默认配置,我们做微服时会添加 spring-boot-starter-web 这个组件 jar 的 pom 依赖,这样配置会默认配置 springmvc 和 tomcat。

  • @ComponentScan:扫描当前包及其子包下被 @Component,@Controller,@Service,@Repository 注解标记的类并纳入到 spring 容器中进行管理。等价于


1552403806170037530.png


大多数情况下,这 3 个注解会被同时使用,基于最佳实践,这三个注解就被做了包装,成为了 @SpringBootApplication 注解。


2、@ServletComponentScan:Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,这样通过注解 servlet ,拦截器,监听器的功能而无需其他配置,所以这次相中使用到了 filter 的实现,用到了这个注解。


3、@MapperScan:spring-boot 支持 mybatis 组件的一个注解,通过此注解指定 mybatis 接口类的路径,即可完成对 mybatis 接口的扫描。


它和 @mapper 注解是一样的作用,不同的地方是扫描入口不一样。@mapper 需要加在每一个 mapper 接口类上面。所以大多数情况下,都是在规划好工程目录之后,通过 @MapperScan 注解配置路径完成 mapper 接口的注入。


添加 mybatis 相应组建依赖之后。就可以使用该注解。


1552403826208060274.png


进一步查看 mybatis-spring-boot-starter 包,可以找到这里已经将 mybatis 做了包装。


这也是 spring 的一个理念,不重复造轮子,整合优秀的资源进入 spring 的体系中。


1552403835980056198.png


4、资源导入注解:@ImportResource @Import @PropertySource 这三个注解都是用来导入自定义的一些配置文件。


@ImportResource(locations={}) 导入其他 xml 配置文件,需要标准在主配置类上。


导入 property 的配置文件 @PropertySource 指定文件路径,这个相当于使用 spring 的


@import 注解是一个可以将普通类导入到 spring 容器中做管理


controller 层




1、@Controller 表明这个类是一个控制器类,和 @RequestMapping 来配合使用拦截请求,如果不在 method 中注明请求的方式,默认是拦截 get 和 post 请求。这样请求会完成后转向一个视图解析器。但是在大多微服务搭建的时候,前后端会做分离。所以请求后端只关注数据处理,后端返回 json 数据的话,需要配合 @ResponseBody 注解来完成。


这样一个只需要返回数据的接口就需要 3 个注解来完成,大多情况我们都是需要返回数据。也是基于最佳实践,所以将这三个注解进一步整合。


@RestController 是 @Controller 和 @ResponseBody 的结合,一个类被加上 @RestController 注解,数据接口中就不再需要添加 @ResponseBody。更加简洁。


同样的情况,@RequestMapping(value="",method= RequestMethod.GET ),我们都需要明确请求方式。这样的写法又会显得比较繁琐,于是乎就有了如下的几个注解。


普通风格Rest风格
@RequestMapping(value=“”,method = RequestMethod.GET)@GetMapping(value =“”)
@RequestMapping(value=“”,method = RequestMethod.POST)@PostMapping(value =“”)
@RequestMapping(value=“”,method = RequestMethod.PUT)@PutMapping(value =“”)
@RequestMapping(value=“”,method = RequestMethod.DELETE)@DeleteMapping(value =“”)


这几个注解是 @RequestMapping(value="",method= RequestMethod.xxx )的最佳实践。为了代码的更加简洁。


2、@CrossOrigin:@CrossOrigin(origins = “”, maxAge = 1000) 这个注解主要是为了解决跨域访问的问题。这个注解可以为整个 controller 配置启用跨域,也可以在方法级别启用。


我们在项目中使用这个注解是为了解决微服在做定时任务调度编排的时候,会访问不同的 spider 节点而出现跨域问题。


3、@Autowired:这是个最熟悉的注解,是 spring 的自动装配,这个个注解可以用到构造器,变量域,方法,注解类型上。当我们需要从 bean 工厂中获取一个 bean 时,Spring 会自动为我们装配该 bean 中标记为 @Autowired 的元素。


4、@EnablCaching@EnableCaching: 这个注解是 spring framework 中的注解驱动的缓存管理功能。自 spring 版本 3.1 起加入了该注解。其作用相当于 spring 配置文件中的 cache manager 标签。


5、@PathVariable:路径变量注解,@RequestMapping 中用{}来定义 url 部分的变量名,如:


1552403886053010745.png


同样可以支持变量名加正则表达式的方式,变量名:[正则表达式]。


1552403897221010225.png




servcie 层注解




1、@Service:这个注解用来标记业务层的组件,我们会将业务逻辑处理的类都会加上这个注解交给 spring 容器。事务的切面也会配置在这一层。当让 这个注解不是一定要用。有个泛指组件的注解,当我们不能确定具体作用的时候 可以用泛指组件的注解托付给 spring 容器。


2、@Resource:@Resource 和 @Autowired 一样都可以用来装配 bean,都可以标注字段上,或者方法上。 @resource 注解不是 spring 提供的,是属于 J2EE 规范的注解。


两个之前的区别就是匹配方式上有点不同,@Resource 默认按照名称方式进行 bean 匹配,@Autowired 默认按照类型方式进行 bean 匹配。




持久层注解****




1、@Repository:@Repository 注解类作为 DAO 对象,管理操作数据库的对象。


总得来看,@Component, @Service, @Controller, @Repository 是 spring 注解,注解后可以被 spring 框架所扫描并注入到 spring 容器来进行管理


@Component 是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能。


通过这些注解的分层管理,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。


所以我们在正常开发中,如果能用 @Service, @Controller, @Repository 其中一个标注这个类的定位的时候,就不要用 @Component 来标注。


2、@Transactional: 通过这个注解可以声明事务,可以添加在类上或者方法上。


在 spring boot 中 不用再单独配置事务管理,一般情况是我们会在 servcie 层添加了事务注解,即可开启事务。要注意的是,事务的开启只能在 public 方法上。并且主要事务切面的回滚条件。正常我们配置 rollbackfor exception 时 ,如果在方法里捕获了异常就会导致事务切面配置的失效。




其他相关注解****




  • @ControllerAdvice 和 @RestControllerAdvice:通常和 @ExceptionHandler、@InitBinder、@ModelAttribute 一起配合使用。

  • @ControllerAdvice 和 @ExceptionHandler 配合完成统一异常拦截处理。

  • @RestControllerAdvice 是 @ControllerAdvice 和 @ResponseBody 的合集,可以将异常以 json 的格式返回数据。


如下面对数据异常返回的统一处理。


1552403914614056458.png


这里是对平时用到的一些注解做了归纳,及应用说明。还有其他更深的知识还需要在后续的用中继续学习。


本文转载自宜信技术学院网站。


原文链接:http://college.creditease.cn/detail/224


2020-02-11 20:211021

评论 1 条评论

发布
暂无评论
发现更多内容

作业一

Kiroro

总结

chenzt

教培行业工程师面临着什么挑战?研发面板全栈式解决工程师的痛点

Deepexi

DevOps 运维 敏捷开发 研发管理 单元测试

第八周作业

方堃

单向链表合并节点

chenzt

作业二

Kiroro

区块链+国防安全,科技是核心战斗力

CECBC

Spring系列:请问各位大佬为何要学spring?

简爱W

架构师第8周练习

小蚂蚁

最新硬件虚拟化检测技术,让攻击者逃不出“楚门的世界”

百度安全

云计算 安全 虚拟化

链表查找算法,HDFS数据节点宕机处理

dony.zhang

作业

不在调上

华青融天战略拓展总监王旭详解IT运维的九阳神功

DT极客

缓存思想在算法设计中的应用梳理

che-ri-sh

缓存

CompletableFuture运行流程源码详解

编号94530

Java 并发编程 多线程 CompletableFuture

各类SQL中日期时间那些事

大唐小生

sql 大数据 SQL语法

Hadoop 中的 Namenode 和 Datanode

dongge

实现DevOps的三步工作法

看山

DevOps 凤凰项目 签约计划第二季

week8

不在调上

第八周·命题作业

刘璐

AI大有可为:NAIE平台助力垃圾分类

华为云开发者联盟

AI 模型训练 垃圾回收机制 数据集 华为云

架构训练营第八周感悟

张锐

架构师第8周学习总结

小蚂蚁

如何在微服务团队中高效使用 Git 管理代码?

看山

git 微服务 高效 签约计划第二季

架构师训练营 - 学习总结 第 8 周

铁血杰克

第八周·总结·数据结构预算法

刘璐

TNFE-Weekly[第六十六周已更新]

莹姐🙈

小程序 大前端 周报

架构师课程第八周总结

dongge

抢占5G大市场 众盟科技助力企业跑赢短视频营销新赛道

人称T客

37岁程序员被裁,想用6月工资跪舔领导划掉被裁名额,结果蒙了!

程序员生活志

程序员 职场

PC人脸识别登录,出乎意料的简单

程序员小富

Java 人脸识别

springboot 之常用注解_行业深度_缑应奎_InfoQ精选文章