SpringBoot常用注解
SpringBoot常用注解
springboot中摒弃了spring以往项目中大量繁琐的配置,遵循“约定大于配置”的原则,通过自身默认配置极大地降低了项目搭建的复杂度。同样在springboot中,大量注解的使用使代码看起来更加简洁,提高开发的效率。这些注解不光包括springboot自有的,也有一些是继承自spring的。
项目配置注解
1. @SpringBootApplication
@SpringBootApplication是一个复合注解(查看源码发现),包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解。
@SpringBootApplication:标注当前类是配置类,这个注解继承自@Configuration,并且将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
@EnableAutoConfiguration:是自动配置的注解,这个注解会根据添加的组件jar来完成一些默认配置。(做微服务架构时会添加spring-boot-starter-web这个组件的jar的pom依赖,这样配置会默认配置springmvc和tomcat。)
@ComponentScan:扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入spring容器中进行管理。等价于<context:component-scan>的xml配置文件中的配置项。

多数情况下,这三个注解会被同时使用,基于最佳实践这三个注解就被做了包装,成为@SpringBootApplication注解。
2. @ServletComponentScan
Servlet、Filter、Listener可以直接通过@WebSerlvet、@WebFilter、@WenListener注解自动注册,这样通过注解Serlvet、拦截器、监听器的功能而无需其他配置。
3. @MapperScan
spring-boot支持mybatis组件的一个注解,通过此注解指定mybatis接口类的路径,即可完成对mybatis接口的扫描。
它和@mapper注解是一样的作用,不同的是扫描入口不一样。@mapper需要加在每一个mapper接口类上。所以多数情况下都是在规划好项目工程目录之后,通过@MapperSacn注解配置路径完成mapper接口的注入。添加mybatis相应的组件依赖之后,就可以使用该注解。

进一步查看mybais-spring-boot-starter包,可以看到这里已经将mabatis做了包装。这也是spring的一个理念,不重复造轮子,整合优秀的资源进入到spring体系中。

4. 资源导入注解
@ImportResource @Import @PropertySource这三个注解都是用来导入自定义的一些配置文件。
@ImportResource(locations={}) 导入其他xml配置文件,需要标注在主配置类上。
@PorpertySource 导入property的配置文件,指定文件路径,这个相当于使用spring的<importresource/>标签来完成配置项的引入。
@Import注解可以将普通类导入到spring容器中做管理。
Controller层
1. @controller
在一个类上添加@Controller注解,表明这个类是一个控制器类,和@RequestMapping来配合使用拦截请求(处理http请求)。如果不在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注解是用来映射请求的,即指明处理器可以处理哪些URL请求,该注解既可以用在类上,也可以用在方法上。
当使用@RequestMapping标记控制器类时,方法的请求地址是相对类地址而言的;当没有使用@RequestMapping标记类时,方法的请求路径是绝对路径。
@RequestMapping的地址可以是url变量,并且通过@PathVariable注解获取作为方法的参数。
@ResponseBody
@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。
2. @CrossOrgin
@CrossOrigin(origins="",maxAge=1000)这个注解主要是为了解决跨域访问的问题,可以为整个controller配置启用跨域,也可以在方法级别使用。
3. @Autowired
它可以对类成员变量、方法、构造函数及注解进行标注,让spring完成bean自动装配的工作。 当需要从bean工厂获取一个bean时,spring会自动装配该bean中标记为@Autowired的元素。
4. @EnableCaching
这个注解是spring framework中的注解驱动的缓存管理功能,其作用相当于spring配置文件中的cache manager标签。
5. @PathVariable
路径变量注解,接收请求路径中占位符的值,@RequestMapping中用{xx}来定义url部分的变量名。
@GetMapping("findById/{id}")
public String findById(@PathVariable int id){
return userService.findById(id);
}
请求路径:http://localhost:8080/lydService/testBoot/findById/1
同样可以支持变量名加正则表达式的方式,变量名:[正则表达式]。

6. @RequestParam
获取请求参数的值
@RequestMapping("/getUser")
public String getUser(@RequestParam("uid")Integer id, Model model) {
System.out.println("id:"+id);
return "user";
}
请求示例:http://localhost:8080/User/getUser?uid=123
7. @PathVariable与@RequestParam的区别
https://www.cnblogs.com/goloving/p/9241393.html
8. @RequestBody
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
注:一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。
注:当同时使用@RequestParam()和@RequestBody时,@RequestParam()指定的参数可以是普通元素、数组、集合、对象等等。
如果参数放在请求体中,传入后台的话,那么后台要用@RequestBody才能接收到;如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam来接收,或则形参前什么也不写也能接收。
service层注解
1. @Service
这个注解用来标记业务层的组件,加上该注解会将业务逻辑处理的类自动注入到Spring容器中。
2. @Resource
@Resource和@Autowired一样都可以用来装配bean,都可以标注在字段上或者方法上。二者的区别在于匹配方式不同,@Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配。
持久层注解
1. @Repository
@Repository用于将数据访问层 (Mapper层 ) 的类标识为Spring Bean,管理操作数据库的对象。
总的来看,@Component @Service @Controller @Repository是spring注解,注解后可以被spring框架扫描并注入到spring容器中进行管理。
@Component是通用注解,其他三个注解是这个注解的拓展,并且有了特定的功能。@Repository、@Service、@Controller分别对应存储层Bean,业务层Bean和展示层Bean。通过这些注解的分层管理,就能将请求处理、业务逻辑处理、数据库操作处理分离出来,降低代码耦合度,也方便以后项目的维护和开发。
在正常开发中,如果能用@Service, @Controller, @Repository其中一个标注这个类的定位的时候,就不要用@Component来标注。
2. @Transactional
通过这个注解声明事务,可以添加在类上或者方法上。在springboot中不再单独配置事务管理,一般情况是在service曾添加事务注解,即可开启事务。
其他相关注解
@ControllerAdvice注解定义全局异常处理类,统一处理异常。
@ExceptionHandler注解生命异常处理方法,用在方法上面表示遇到这个异常就执行以下方法。
@ControllerAdvice和@RestControllerAdvice:通常和@ExceptionHandler @InitBinder @ModelAttribute一起配合使用。
@ControllerAdvice和@ExceptionHandler配合完成统一异常拦截处理。
@RestControllerAdvice是@ControllerAdvice和@ResponseBody的合集,可以将异常以json的格式返回数据。
json
一种与开发语言无关的、轻量级的数据存储格式,全称JavaScript Object Notation,一种数据格式的标准规范。起初来源于JavaScript这门语言,后来随着使用的广泛,几乎每门开发语言都有处理JSON的API(应用程序接口)。
优点:易于人的阅读和编写,易于程序解析与生产。
样例:首先一个花括号{},整个代表一个对象,同时里面是一种Key-Value的存储形式,它还有不同的数据类型来区分。
