Spring Boot 的常用注解
- 1.什么是注解式编程
- 2.了解系统注解
- 3.使用在类名上的注解
-
- [3.1 @RestController](#3.1 @RestController)
- [3.2 @Controller](#3.2 @Controller)
- [3.3 @Service](#3.3 @Service)
- [3.4 @Repository](#3.4 @Repository)
- [3.5 @Component](#3.5 @Component)
- [3.6 @Configuration](#3.6 @Configuration)
- [3.7 @Resource](#3.7 @Resource)
- [3.8 @Autowired](#3.8 @Autowired)
- [3.9 @RequestMapping](#3.9 @RequestMapping)
- [3.10 @Transactional](#3.10 @Transactional)
- [3.11 @Qualifier](#3.11 @Qualifier)
- 4.使用在方法上的注解
-
- [4.1 @RequestBody](#4.1 @RequestBody)
- [4.2 @PathVariable](#4.2 @PathVariable)
- [4.3 @Bean](#4.3 @Bean)
- [4.4 @ResponseBody](#4.4 @ResponseBody)
- 5.其他常用注解
1.什么是注解式编程
注解(annotations
)用来定义一个 类、属性 或一些 方法,以便程序能被编译处理。它相当于一个 说明文件,告诉应用程序某个被注解的类或属性是什么,要怎么处理。注解可以用于标注包、方法和变量等。
下方代码中的注解 @RestController,是一个用来定义 Rest 风格的控制器。其中,注解 @GetMapping("/hello")
定义的访问路径是 "/hello"
。
java
@RestController
public class Hello {
@GetMapping("hello")
public String hello() throws Exception{
return "Hello, Spring Boot!";
}
}
2.了解系统注解
注解 | 说明 |
---|---|
@Override | 用于修饰方法,表示此方法重写了父类方法 |
@Deprecated | 用于修饰方法,表示此方法已经过时。经常在版本升级后会遇到 |
@SuppressWarnnings | 告诉编译器忽视某类编译警告 |
下面重点介绍一下 @SuppressWarnnings 注解。它有以下几种属性
unchecked
:未检查的转化。unused
:未使用的变量。resource
:泛型,即未指定类型。path
:在类中的路径。原文件路径中有不存在的路径。deprecation
:使用了某些不赞成使用的类和方法。fallthrough
:switch
语句执行到底,不会遇到break
关键字。serial
:实现了 Serializable,但未定义 serialVersionUlD。rawtypes
:没有传递带有泛型的参数。all
:代表全部类型的警告。
3.使用在类名上的注解
注解 | 使用位置 | 说明 |
---|---|---|
@RestController | 类名上 | 作用相当于 @ResponseBody 加 @Controller |
@Controller | 类名上 | 声明此类是一个 SpringMVC Controller 对象 |
@Service | 类名上 | 声明一个业务处理类(实现非接口类) |
@Repository | 类名上 | 声明数据库访问类(实现非接口类) |
@Component | 类名上 | 代表其是 Spring 管理类,常用在无法用 @Service、@Repository 描述的 Spring 管理的类上,相当于通用的注解 |
@Configuration | 类名上 | 声明此类是一个配置类,常与 @Bean 配合使用 |
@Resource | 类名上、属性或构造函数参数上 | 默认按 byName 自动注入 |
@Autowired | 类名上、属性或构造函数参数上 | 默认按 byType 自动注入 |
@RequestMapping | 类名或方法上 | 如果用在类上,则表示所有响应请求的方法都是以该地址作为父路径的 |
@Transactional | 类名或方法上 | 用于处理事务 |
@Qualifier | 类名或方法上 | 为 Bean 指定名称,随后再通过名字引用 Bean |
3.1 @RestController
它用于返回 JSON(JavaScript Object Notation,JS 对象简谱)、XML(eXtensible Markup Language)等数据,但不能返回 HTML 页面。相当于注解 @ResponseBody 和注解 @Controller 合在一起的作用。
例如:
java
@RestController
public class HelloWorldController {
@RequestMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}
3.2 @Controller
它用于标注控制器层,在 MVC 开发模式中代表 C(控制器)。
下面的代码程序和 3.1 @RestController 中的例子是等效的,也是返回 JSON 格式的数据。
java
@Controller
public class HelloWorldBMvcController{
@RequestMapping("/helloworldB")
@ResponseBody
public String helloWorld() throws Exception {
return "Hello, Spring Boot!";
}
}
@Controller 主要用于构建 MVC 模式的程序。
3.3 @Service
它用于声明一个业务处理类(实现非接口类),用于标注服务层,处理业务逻辑。
例如,以下代码就是继承 ArticleService 来实现其方法。
java
/**
* Description: 标注为服务类
*/
@Service
public class ArticleServiceImpl implements ArticleService {
@Autowired
private ArticleRepository articleRepository;
/**
* Description:重写 service 接口的实现,实现根据 id 查询对象功能
*/
@Override
public Article findArticleByld(long id) {
return articleRepository.findBvld(id);
}
}
3.4 @Repository
它用于标注数据访问层。
3.5 @Component
它用于把普通 POJO(Plain Ordinay Java Objects
,简单的 Java 对象)实例化到 Spring 容器中。当类不属于注解 @Conroller 和 @Service 等时,就可以使用注解 @Component 这个类。它可以配合 CommandLineRunner 使用,以便在程序启动后执行一些基础任务。
Spring 会把被注解 @Conroller、@Service、@Repository、@Component 标注的类纳入 Spring 容器中进行管理。
3.6 @Configuration
它用于标注配置类,并且可以由 Spring 容器自动处理。它作为 Bean 的载体,用来指示一个类声明、一个或多个 @Bean 方法,在运行时为这些 Bean 生成 BeanDefinition 和服务请求。
3.7 @Resource
@Autowired 与 @Resource 都可以用来装配 Bean,也都可以写在字段上或 Seter 方法上。
java
public class AritcleController {
@Resource
private ArticleRepository articleRepository;
/**
* Description: 新增保存方法
*/
@PostMapping("")
public String saveArticle(Article model) {
articleRepository.save(model);
return "redirect:/article/";
}
}
3.8 @Autowired
它表示被修饰的类需要注入对象。Spring 会扫描所有被 @Autowired 标注的类,然后根据类型在 IoC 容器中找到匹配的类进行注入。被@Autowired 注解后的类不需要再导入文件。
3.9 @RequestMapping
它用来处理请求地址映射,用在类或方法上。如果用在类上,则表示类中的所有响应请求的方法都是以该地址作为父路径的。该注解有 6 个属性。
Params
:指定 Request 中必须包含某些参数值,才让该方法处理。Headers
:指定 Request 中必须包含某些指定的 header 值,才能让该方法处理请求。Value
:指定请求的实际地址,指定的地址可以是 URI Template 模式。Method
:指定请求的 Method 类型,如 GET、POST、PUT、DELETE 等。Consumes
:指定处理请求的提交内容类型 Content-Type,如application/json,text/html
。Produces
:指定返回的内容类型。只有当 Request 请求头中的 Accept 类型中包含该指定类型时才返回。
3.10 @Transactional
它可以用在接口、接口方法、类及类方法上。
但 Spring 不建议在接口或者接口方法上使用该注解,因为该注解只有在使用基于接口的代理时才会生效。如果异常被捕获(try { } catch {}
)了,则事务就不回滚了。如果想让事务回滚,则必须再往外抛出异常(try { } catch { throw Exception }
。
3.11 @Qualifier
它的意思是 "合格者",用于标注哪一个实现类才是需要注入的。需要注意的是,@Qualifier 的参数名称为被注入的类中的注解 @Service 标注的名称。
@Qualifier 常和 @Autowired 一起使用,如以下代码:
java
@Autowired
@Qualifier("articleService")
4.使用在方法上的注解
注解 | 使用位置 | 说明 |
---|---|---|
@RequestBody | 方法参数前 | 常用来处理 application/json 、application/xml 等 Content-Type 类型的数据,意味着 HTTP 消息是 JSON / XML 格式,需将其转化为指定类型参数 |
@PathVariable | 方法参数前 | 将 URL 获取的参数映射到方法参数上 |
@Bean | 方法上 | 声明该方法的返回结果是一个由 Spring 容器管理的 Bean |
@ResponseBody | 方法上 | 通过适当的 HttpMessageConverter 将控制器中方法返回的对象转换为指定格式(JSON / XML)后,写入 Response 对象的 body 数据区 |
4.1 @RequestBody
它常用来处理 JSON / XML 格式的数据。通过 @RequestBody 可以将请求体中的(JSON / XML)字符串绑定到相应的 Bean上,也可以将其分别绑定到对应的字符串上。
举例:用 AJAX(前端)提交数据,然后在控制器(后端)接收数据。
在前端页面中使用 AJAX 提交数据的代码如下:
javascript
$.ajax({
url:"/post",
type:"POST",
data:'{"name":"pipi"}',
// 这里不能写成 content-type
contentType:"application/json charset=utf-8",
success:function(data){
alert("request success !");
}
});
在控制器中接收数据的代码如下:
java
@requestMapping("/post")
public void post(@requestBody String name){
//省略
}
4.2 @PathVariable
用于获取路径中的参数。
4.3 @Bean
它代表产生一个 Bean,并交给 Spring 管理。用于封装数据,一般有 Setter、Getter 方法在 MVC 模型中,对应的是 M(模型)。
4.4 @ResponseBody
它的作用是通过转换器将控制器中方法返回的对象转换为指定的格式,然后写入 Response 对象的 body 区。它常用来返回 JSON / XML 格式的数据。
使用此注解后,数据直接写入输入流中,不需要进行视图渲染。用法见以下代码:
java
@GetMapping("/test")
@ResponseBody
public String test() {
return "test";
}
5.其他常用注解
注解 | 使用位置 | 说明 |
---|---|---|
@EnableAutoConfiguration | 入口类/类名上 | 用来提供自动配置 |
@SpringBootApplication | 入口类/类名上 | 用来启动入口类 Application |
@EnableScheduling | 入口类/类名上 | 用来开启计划任务。Spring 通过 @Scheduled 支持多种类型的计划任务,包含 cron 、fixDelay 、fixRate 等 |
@EnableAsync | 入口类/类名上 | 用来开启异步注解功能 |
@ComponentScan | 入口类/类名上 | 用来扫描组件,可自动发现和装配一些 Bean。它根据定义的扫描路径,把符合扫描规则的类装配到 Spring 容器中,告诉 Spring 哪个包(package)的类会被 Spring 自动扫描并且装入 IoC 容器。它对应 XML 配置中的元素。可以通过 basePackages 等属性来细粒度地定制自动扫描的范围,默认会从声明 @ComponentScan 所在类的包进行扫描 |
@Aspec | 入口类/类名上 | 标注切面,可以用来配置事务、日志、权限验证,在用户请求时做一些处理等 |
@ControllerAdvice | 类名上 | 包含 @Component,可以被扫描到。统一处理异常 |
@ExceptionHandier | 方法上 | 用在方法上,表示遇到这个异常就执行该方法 |
@Value | 属性上 | 用于获取配置文件中的值 |
Spring Boot 提供的注解非常多,这里不可能面面俱到。在以后得博客中还会详细讲解一些注解。