QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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:211046

评论 1 条评论

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

为什么90%的“码农”做不了软件“架构师”?

Java架构师迁哥

Java 学习 架构师

数字货币视域下的金融安全实现路径

CECBC

区块链 数字货币

致谢!华为全联接2020精彩回顾

华为云开发者联盟

华为 华为云 智能 hdc

手把手教你:将 ClickHouse 集群迁至云上

腾讯云大数据

大数据 Clickhouse

为什么推广ipv6以及网站ipv6改造基本步骤

MySQL从删库到跑路

Web IP 网络

架构师第一期作业(第三周)

Cheer

作业

区块链带来的技术创新和变革

CECBC

区块链技术 经济

揭开500亿“区块链”骗局

CECBC

法律 传销

看看别人是怎么面试蚂蚁金服的!社招Java面经分享

Java架构师迁哥

Java 阿里巴巴 面试 蚂蚁金服

华为云推出全自研数据库,GaussDB(openGauss)能否撑起一片天?

华为云开发者联盟

数据库 数据 gauss db

线段树(Segment Tree)

zayfen

算法 线段树 segment tree

原创 | 使用JPA实现DDD持久化-O/R阻抗失配(2/2)

编程道与术

Java hibernate DDD JDBC jpa

腾讯云大数据发布最新产品矩阵,助力企业整合打通海量数据

腾讯云大数据

大数据

一次注定失败的裸面

escray

ruby 程序员 面试 面经

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

邓昀垚

极客大学架构师训练营

你在开发过程中使用Git Rebase还是Git Merge?

华为云开发者联盟

git 华为 管理 代码

第二周-学习总结-框架设计原则

莫森

极客大学架构师训练营

原创 | 正确区分属性和字段

编程道与术

Java hibernate 编程 软件开发 jpa

原创 | 使用JPA实现DDD持久化-JPA vs MyBatis

编程道与术

Java hibernate 编程 mybatis jpa

LeetCode题解:641. 设计循环双端队列,使用双向链表,JavaScript,详细注释

Lee Chen

大前端 LeetCode

架构师训练营第三周作业

文智

极客大学架构师训练营

倒计时!Pulsar Summit Asia 2020 演讲征集

Apache Pulsar

开源 云原生 pulsar Apache Pulsar 消息中间件

打造一个全功能的浏览器

Daniel

原创视频 | 架构漫谈—如何创造复杂而有序的软件系统【含课件下载】

编程道与术

Java 编程 架构 软件开发 软件架构

原创 | 使用JPA实现DDD持久化-JPA,Hibernate与Spring Data JPA

编程道与术

Java hibernate Spring C Data jpa

jdk 源码系列之StringBuilder、StringBuffer

sinsy

Java jdk 源码解析

持续引领大数据行业发展,腾讯云发布全链路数据开发平台WeData

腾讯云大数据

大数据

用go语言实现快排

Sean

算法 快速排序 Go 语言

第二周-命题作业

莫森

极客大学架构师训练营

腾讯云副总裁刘煜宏:大数据平台算力弹性资源池达500万核,国内最强

腾讯云大数据

大数据

Greenplum 性能优化之路 --(一)分区表

腾讯云大数据

大数据

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