【Spring Boot】Spring Boot 的常用注解

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:使用了某些不赞成使用的类和方法。
  • fallthroughswitch 语句执行到底,不会遇到 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/jsonapplication/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 支持多种类型的计划任务,包含 cronfixDelayfixRate
@EnableAsync 入口类/类名上 用来开启异步注解功能
@ComponentScan 入口类/类名上 用来扫描组件,可自动发现和装配一些 Bean。它根据定义的扫描路径,把符合扫描规则的类装配到 Spring 容器中,告诉 Spring 哪个包(package)的类会被 Spring 自动扫描并且装入 IoC 容器。它对应 XML 配置中的元素。可以通过 basePackages 等属性来细粒度地定制自动扫描的范围,默认会从声明 @ComponentScan 所在类的包进行扫描
@Aspec 入口类/类名上 标注切面,可以用来配置事务、日志、权限验证,在用户请求时做一些处理等
@ControllerAdvice 类名上 包含 @Component,可以被扫描到。统一处理异常
@ExceptionHandier 方法上 用在方法上,表示遇到这个异常就执行该方法
@Value 属性上 用于获取配置文件中的值

Spring Boot 提供的注解非常多,这里不可能面面俱到。在以后得博客中还会详细讲解一些注解。

相关推荐
java6666688889 分钟前
在Spring Boot中集成分布式日志收集方案
spring boot·分布式·jenkins
长亭外的少年13 分钟前
ClickHouse 介绍:深度解析高性能列式数据库的核心优势
java·数据库·clickhouse
tokengo16 分钟前
从Java开发者到.NET Core初级工程师学习路线:C#语言基础
java·csharp·新人入门
java66666888816 分钟前
深入理解Spring Boot中的配置加载顺序
java·spring boot·后端
AllenIverrui41 分钟前
MyBatisPlus的使用
spring boot·spring·java-ee·mybatis
空青7261 小时前
ChatGPT在Java后端开发中的应用与影响
java·开发语言·人工智能·后端·神经网络·机器学习·chatgpt
莫得等待1 小时前
MySQL的慢sql
java
冯宝宝^1 小时前
图书管理系统
服务器·数据库·vue.js·spring boot·后端
威哥爱编程1 小时前
Nginx性能调优5招35式不可不知的策略实战
java·nginx·性能调优
五月阳光暖洋洋1 小时前
SpringBoot2.2.6使用spring-boot-validation读取不到自定义配置文件中的属性
java·开发语言·spring boot