在 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 容器中进行管理. 等价于 < context:component-scan > 的 xml 配置文件中的配置项.
大多数情况下, 这 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 相应组建依赖之后. 就可以使用该注解.
进一步查看 mybatis-spring-boot-starter 包, 可以找到这里已经将 mybatis 做了包装.
这也是 spring 的一个理念, 不重复造轮子, 整合优秀的资源进入 spring 的体系中.
4, 资源导入注解:@ImportResource @Import @PropertySource 这三个注解都是用来导入自定义的一些配置文件.
@ImportResource(locations={}) 导入其他 xml 配置文件, 需要标准在主配置类上.
导入 property 的配置文件 @PropertySource 指定文件路径, 这个相当于使用 spring 的 < importresource/>标签来完成配置项的引入.
@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 部分的变量名, 如:
同样可以支持变量名加正则表达式的方式, 变量名:[正则表达式].
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 的格式返回数据.
如下面对数据异常返回的统一处理.
这里是对平时用到的一些注解做了归纳, 及应用说明. 还有其他更深的知识还需要在后续的用中继续学习.
参考文档
- https://docs.spring.io/spring-boot/docs/2.1.x/reference/html/
- https://spring.io/projects/spring-boot/
来源: https://juejin.im/post/5c875a766fb9a049f06b1991