写点什么

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

评论 1 条评论

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

如何定期清理数据库中的无效数据?

NineData

数据清理 数据归档 NineData 无效数据 优化数据库

开放原子开源大赛—基于OpenHarmony的团结引擎应用开发赛正式启动!

OpenHarmony开发者

软件测试学习笔记丨服务端问题定位常用linux指令集合

测试人

Linux 软件测试

一分钟了解JAVA语言

小齐写代码

等保测评与信息安全管理体系认证的区别

行云管家

等保 等级保护 等保测评

数据“隐领”未来!【隐私计算实训营】限时免费招募!

隐语SecretFlow

数据分析 数据安全 隐私计算

小红书笔记详情API:让内容创造更高效含代码

技术冰糖葫芦

API Explorer API 接口 API 策略

利用阿里巴巴1688商品详情API:实现电商数据的快速整合

技术冰糖葫芦

API 接口 API 策略

Tapjoy from Unity 推出“每日奖励”积分墙广告,以增强用户粘性并提升投放 ROAS

极客天地

解读 Amazon Q | 用 AI 聊天机器人连接你与未来的无限可能

亚马逊云科技 (Amazon Web Services)

超越基础设施:深度探讨平台工程的关键支柱

SEAL安全

架构 基础设施 平台工程

为了跳槽或提升自己,你会先学习哪一门编程语言?

小魏写代码

提升地理空间分析效率,火山引擎ByteHouse上线GIS能力

字节跳动数据平台

数据库 大数据

npm是如何处理多版本依赖的?

伤感汤姆布利柏

就业寒冬,最终拿到5个offer的一些经验分享

霍格沃兹测试开发学社

代码精简执行过程

京东科技开发者

人工智能(AI)+、+了什么?互联网+又是什么?

天津汇柏科技有限公司

互联网+ #人工智能

面试八股文,自有其道理

老张

面试 专业能力

以守为攻,零信任安全防护能力的新范式

权说安全

零信任

软件测试岗位我是如何拿到5个offer的一些经验分享(附面试题)

测试人

软件测试 面试题

【一文读懂】基于Havenask向量检索+大模型,构建可靠的智能问答服务

阿里技术

向量检索 LLM 智能问答 Havenask 召回搜索引擎

20个Python random模块的代码示例

华为云开发者联盟

Python 开发 华为云 华为云开发者联盟

第42期 | GPTSecurity周报

云起无垠

「飞桨星河社区创作者激励计划」全新上线!丰富权益,等你领取~

飞桨PaddlePaddle

百度 开发者社区 百度飞桨 星河社区 飞桨星河社区

万字带你了解ChatGLM

华为云开发者联盟

人工智能 华为云 大模型 华为云开发者联盟

立即注册 | 线上讲座:借助 NGINX Plus 优化物联网数据传输和应用安全

NGINX开源社区

TLS 物联网 IoT mqtt NGINX PLUS

网络安全等级测评师考试培训可以参考哪些资料?

行云管家

等保 等级保护 等保测评师

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