Spring Boot 的核心注解

一、引言

Spring Boot 作为一种流行的 Java 开发框架,以其简洁高效的开发方式受到广泛关注。其中,核心注解在 Spring Boot 应用的开发中起着至关重要的作用。理解这些注解的含义和用法,对于充分发挥 Spring Boot 的优势至关重要。本文将深入剖析 Spring Boot 的核心注解。

二、@SpringBootApplication 注解

(一)功能概述

  1. 组合注解
    • @SpringBootApplication 是一个组合注解,它包含了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解的功能。
  2. 配置应用
    • 该注解用于标识一个 Spring Boot 应用的主配置类,告诉 Spring Boot 框架如何进行自动配置和组件扫描。

(二)用法详解

  1. 定义主类
    • 在 Spring Boot 应用中,通常会创建一个主类,并使用 @SpringBootApplication 注解进行标识。这个主类通常包含一个 main 方法,用于启动应用程序。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

  1. 自动配置

    • @SpringBootApplication 注解会触发 Spring Boot 的自动配置机制。Spring Boot 会根据项目中引入的依赖和类路径中的内容,自动配置应用程序所需的各种组件和配置。
  2. 组件扫描

    • 该注解还会启动组件扫描功能,自动扫描主类所在的包及其子包中的所有带有 @Component、@Service、@Repository、@Controller 等注解的类,并将它们注册为 Spring 容器中的 Bean。

三、@Configuration 注解

(一)功能介绍

  1. 定义配置类
    • @Configuration 注解用于标识一个类为 Spring 的配置类。在配置类中,可以使用 @Bean 注解定义 Bean,并进行各种配置。
  2. 替代 XML 配置
    • 随着 Spring 的发展,越来越多的开发者倾向于使用基于 Java 的配置方式,而 @Configuration 注解就是实现这种配置方式的关键。

(二)用法示例

  1. 定义 Bean
    • 在配置类中,可以使用 @Bean 注解定义 Bean。例如,定义一个名为 myService 的 Bean:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
}

  1. 导入其他配置类
    • 可以使用 @Import 注解导入其他配置类,实现配置的模块化。例如:
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;@Configuration
@Import(AnotherConfig.class)
public class MainConfig {
}

四、@EnableAutoConfiguration 注解

(一)自动配置原理

  1. 依赖分析
    • @EnableAutoConfiguration 注解会根据项目中引入的依赖,自动配置应用程序所需的各种组件。例如,如果项目中引入了 Spring Data JPA 的依赖,Spring Boot 会自动配置数据库连接和 JPA 相关的组件。
  2. 排除特定自动配置
    • 有时候,可能需要排除某些自动配置。可以使用 @SpringBootApplication 的 exclude 属性来排除特定的自动配置类。例如:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

(二)使用场景

  1. 快速开发
    • 在快速开发过程中,@EnableAutoConfiguration 注解可以大大减少配置的工作量,提高开发效率。
  2. 集成第三方库
    • 当集成第三方库时,Spring Boot 的自动配置功能可以自动配置与该库相关的组件,使得集成更加简单快捷。

五、@ComponentScan 注解

(一)扫描机制

  1. 包扫描
    • @ComponentScan 注解用于指定 Spring 容器进行组件扫描的包路径。默认情况下,它会扫描主类所在的包及其子包中的所有带有 @Component、@Service、@Repository、@Controller 等注解的类,并将它们注册为 Spring 容器中的 Bean。
  2. 自定义扫描路径
    • 可以通过 basePackages 属性指定自定义的扫描路径。例如:
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages = {"com.example.myapp.service", "com.example.myapp.repository"})
public class AppConfig {
}

(二)与其他注解的配合

  1. 与 @Controller、@Service、@Repository 等注解配合
    • @ComponentScan 注解与这些注解配合使用,可以实现自动注册 Bean 的功能。例如,当一个类被标注为 @Service 时,@ComponentScan 注解会将其扫描并注册为 Spring 容器中的一个服务 Bean。
  2. 与 @Configuration 注解配合
    • 在配置类中,通常会使用 @ComponentScan 注解来指定组件扫描的范围,以便将其他带有注解的类注册为 Bean。

六、@Autowired 注解

(一)依赖注入原理

  1. 自动装配
    • @Autowired 注解用于实现依赖注入。当一个类的字段、构造函数或方法被标注为 @Autowired 时,Spring 容器会自动将匹配的 Bean 注入到该字段、构造函数或方法中。
  2. 按类型匹配
    • Spring 容器会根据 Bean 的类型进行匹配。如果有多个相同类型的 Bean,还可以使用 @Qualifier 注解指定具体要注入的 Bean 的名称。

(二)用法示例

  1. 字段注入
    • 在类的字段上使用 @Autowired 注解,实现字段的自动注入。例如:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {@Autowiredprivate MyRepository myRepository;public void doSomething() {// 使用 myRepository}
}

  1. 构造函数注入
    • 在构造函数上使用 @Autowired 注解,实现构造函数的自动注入。例如:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {private final MyRepository myRepository;@Autowiredpublic MyService(MyRepository myRepository) {this.myRepository = myRepository;}public void doSomething() {// 使用 myRepository}
}

  1. 方法注入
    • 在方法上使用 @Autowired 注解,实现方法的自动注入。例如:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {private MyRepository myRepository;@Autowiredpublic void setMyRepository(MyRepository myRepository) {this.myRepository = myRepository;}public void doSomething() {// 使用 myRepository}
}

七、@Value 注解

(一)属性注入

  1. 从配置文件中获取值
    • @Value 注解可以用于从配置文件(如 application.properties 或 application.yml)中获取属性值,并注入到字段、构造函数参数或方法参数中。
  2. 表达式支持
    • 还可以使用 SpEL(Spring Expression Language)表达式来获取更复杂的值。例如:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class MyService {@Value("${my.property}")private String myProperty;@Value("#{T(java.lang.Math).random() * 100}")private int randomNumber;public void doSomething() {// 使用 myProperty 和 randomNumber}
}

(二)使用场景

  1. 动态配置
    • 在需要根据不同环境进行动态配置的情况下,@Value 注解非常有用。可以将配置文件中的属性值注入到 Bean 中,实现灵活的配置。
  2. 参数化构造函数
    • 可以在构造函数参数上使用 @Value 注解,实现参数化的构造函数,根据配置文件中的值来创建 Bean。

八、@RequestMapping 注解

(一)处理 HTTP 请求

  1. 映射请求路径
    • @RequestMapping 注解用于将一个方法映射到特定的 HTTP 请求路径上。它可以用在类级别和方法级别上,用于定义控制器类和方法的请求映射。
  2. 支持多种 HTTP 方法
    • 可以通过 value 属性指定请求路径,通过 method 属性指定支持的 HTTP 方法(如 GET、POST、PUT、DELETE 等)。

(二)用法示例

  1. 类级别映射
    • 在控制器类上使用 @RequestMapping 注解,定义类级别的请求映射。例如:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api")
public class MyController {// 方法级别的请求映射将在此基础上进行
}

  1. 方法级别映射
    • 在控制器方法上使用 @RequestMapping 注解,定义具体的请求映射。例如:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api")
public class MyController {@RequestMapping(value = "/users", method = RequestMethod.GET)public List<User> getUsers() {// 返回用户列表}
}

九、@RestController 注解

(一)构建 RESTful API

  1. 标识控制器
    • @RestController 注解是 @Controller 和 @ResponseBody 的组合注解。它用于标识一个控制器类,该类中的方法将返回 JSON、XML 或其他格式的响应数据,用于构建 RESTful API。
  2. 自动序列化响应数据
    • 当一个方法被标注为 @RestController 注解的类中的方法返回一个对象时,Spring Boot 会自动将该对象序列化为 JSON 或其他格式的响应数据,并返回给客户端。

(二)与其他注解的配合

  1. 与 @RequestMapping 注解配合
    • @RestController 注解通常与 @RequestMapping 注解一起使用,用于定义 RESTful API 的请求映射和响应数据。
  2. 与 @Service、@Repository 等注解配合
    • 在构建复杂的应用程序时,@RestController 注解可以与其他注解(如 @Service、@Repository)配合使用,实现业务逻辑和数据访问的分离。

十、实际案例分析

(一)案例背景

假设有一个简单的博客应用,需要实现文章的管理功能,包括创建、读取、更新和删除文章。

(二)技术选型

  1. 使用 Spring Boot 构建应用
    • 选择 Spring Boot 作为开发框架,利用其快速开发、自动配置等优势。
  2. 数据库选择
    • 选择一个关系型数据库(如 MySQL)来存储文章数据。
  3. 前端框架选择
    • 可以选择一个前端框架(如 Vue.js 或 React)来构建用户界面,与后端的 Spring Boot 应用进行交互。

(三)核心注解的应用

  1. @SpringBootApplication 注解
    • 在主类上使用 @SpringBootApplication 注解,标识这是一个 Spring Boot 应用的主配置类。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class BlogApplication {public static void main(String[] args) {SpringApplication.run(BlogApplication.class, args);}
}

  1. @Configuration 注解
    • 创建一个配置类,使用 @Configuration 注解标识。在这个配置类中,可以定义 Bean 和进行其他配置。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;@Configuration
public class AppConfig {@Beanpublic JdbcTemplate jdbcTemplate() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/blogdb");dataSource.setUsername("root");dataSource.setPassword("password");return new JdbcTemplate(dataSource);}
}

  1. @Autowired 注解
    • 在服务类和控制器类中,使用 @Autowired 注解进行依赖注入。例如,在文章服务类中注入 JdbcTemplate:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class ArticleService {private final JdbcTemplate jdbcTemplate;@Autowiredpublic ArticleService(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public void createArticle(Article article) {// 使用 jdbcTemplate 执行数据库插入操作}public Article getArticleById(int id) {// 使用 jdbcTemplate 执行数据库查询操作}// 其他方法
}

  1. @RequestMapping 注解和 @RestController 注解
    • 在控制器类中,使用 @RequestMapping 注解和 @RestController 注解定义 RESTful API 的请求映射。例如:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/articles")
public class ArticleController {private final ArticleService articleService;@Autowiredpublic ArticleController(ArticleService articleService) {this.articleService = articleService;}@RequestMapping(method = RequestMethod.POST)public void createArticle(Article article) {articleService.createArticle(article);}@RequestMapping(value = "/{id}", method = RequestMethod.GET)public Article getArticleById(@PathVariable int id) {return articleService.getArticleById(id);}// 其他方法
}

(四)效果评估

  1. 开发效率
    • 通过使用 Spring Boot 的核心注解,大大提高了开发效率。自动配置和依赖注入功能减少了手动配置的工作量,使得开发过程更加快捷。
  2. 代码可读性和可维护性
    • 注解的使用使得代码更加清晰易读,易于理解和维护。例如,通过 @RequestMapping 注解和 @RestController 注解,可以很容易地看出控制器类的作用和请求映射关系。
  3. 功能实现
    • 成功实现了博客应用的文章管理功能,包括创建、读取、更新和删除文章。通过 RESTful API 的方式,使得前端可以方便地与后端进行交互。

十一、总结

Spring Boot 的核心注解在开发过程中起着至关重要的作用。@SpringBootApplication、@Configuration、@EnableAutoConfiguration、@ComponentScan、@Autowired、@Value、@RequestMapping 和 @RestController 等注解分别在应用的配置、自动配置、组件扫描、依赖注入、属性注入、请求映射和构建 RESTful API 等方面发挥着重要作用。通过深入理解这些注解的功能和用法,并结合实际案例进行应用,可以提高开发效率,增强代码的可读性和可维护性,实现高效的 Java 开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/469205.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flink 同步oracle11g数据表到pg库

1. 关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld systemctl status firewalldvi /etc/selinux/config 修改为disabled2.安装java8 yum list java-1.8* yum install java-1.8.0-openjdk* -yjava -version3.下载和部署postgresql 看需求安装pg库…

用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(三)

概述 从 WWDC 24 开始&#xff0c;苹果推出了全新的测试机制&#xff1a;Swift Testing。利用它我们可以大幅度简化之前“老态龙钟”的 XCTest 编码范式&#xff0c;并且使得单元测试更加灵动自由&#xff0c;更符合 Swift 语言的优雅品味。 在这里我们会和大家一起初涉并领略…

Vue 2 —Vue Router 页面导航和参数传递

当从A页面跳转到B页面的时候把数据也一起传递过去&#xff0c;可用Vue Router 功能&#xff1a; 一、. this.$router.push 方法 Vue Router 是 Vue.js 的官方路由管理器&#xff0c;允许你在应用中进行页面导航&#xff08;即跳转到不同的 URL 路径&#xff09;。 this.$rout…

【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:技术、应用与伦理思考

一、引言 在当今科技迅速发展的时代&#xff0c;声音克隆技术成为人工智能领域的一个备受瞩目的分支。GPT-SoVITS V2作为一种声音克隆工具&#xff0c;正逐渐进入人们的视野&#xff0c;它在多个领域展现出巨大的潜力&#xff0c;同时也引发了一系列值得深入探讨的问题。本文旨…

ssm092基于Tomcat技术的车库智能管理平台+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;车库智能管理平台设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本车库智能管理平台…

11 Oracle Golden Gate 高可用解决方案:Golden Gate 助力企业保障业务连续性

文章目录 Oracle Golden Gate 高可用解决方案&#xff1a;Golden Gate 助力企业保障业务连续性一、Oracle Golden Gate基本概念二、设计异地灾备策略2.1 需求分析2.2 网络规划2.3 部署架构 三、实施异地灾备策略3.1 环境准备3.2 配置Golden Gate3.3 验证与测试 四、数据保护策略…

【NLP】使用 PyTorch 从头构建自己的大型语言模型 (LLM)

读完这篇文章后&#xff0c;你会取得什么成就&#xff1f;你将能够自己构建和训练大型语言模型 (LLM)&#xff0c;同时与我一起编写代码。虽然我们正在构建一个将任何给定文本从英语翻译成马来语的 LLM&#xff0c;但你可以轻松地修改此 LLM 架构以用于其他语言翻译任务。 LLM…

绘制3D图

一个 3D 函数的表面图&#xff0c;其中包含向量场。 Python 代码示例&#xff0c;使用 matplotlib 和 numpy 库来绘制类似的图。 python 复制代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D# 生成网格 x np.linspace(-…

MATLAB实战 利用1D-DCGAN生成光谱或信号数据

0.前言 在光谱学或信号处理领域&#xff0c;获取大量高质量的数据可能是一项挑战。利用DCGAN迁移对抗生成光谱或信号数据&#xff0c;可以有效地增加数据集的多样性&#xff0c;提高模型的泛化能力。 该实战项目提供了所有源代码与测试数据&#xff0c;旨在帮助学者快速地掌握了…

华为:hcia综合实验

一、拓扑图 二、实验要求 1. pc地址请自行规划&#xff0c;vlan已给出 2. 服务器地址自行规划&#xff0c;vlan&#xff0c;网段已给出 3. 交换机互联链路捆绑保证冗余性 4. 内网pc网关集中于核心交换机&#xff0c;交换机vlan 40互联路由器 ,地址网段已给出 5.配置静态路由实…

jenkins流水线pipeline

创建项目 1. 新建item 并选择pipeline 1.1 和普通项目配置的区别 普通项目配置目录&#xff1a; pipeline项目目录&#xff1a; pipeline的两种语法 声明式语法 2. 配置 2.1 流水线配置 2.2 选择声明式 声明式需要添加一个名为Jenkinsfile的文件实现流水线 Jenkinsfile的…

微信小程序自定义tabbar;禁用某个tab;修改某个tab的样式

微信小程序自定义tabbar&#xff1b;禁用某个tab&#xff1b;修改某个tab的样式 原本使用本身的tabBar就已经很舒服了&#xff0c;很合适了的&#xff0c;但是总有一些脑洞大开的产品和客户&#xff0c;给你搞点多样式&#xff0c;没办法牛马就得去做咯&#xff0c;现在就给大…

深入浅出rust内存对齐

在 Rust 中&#xff0c;内存对齐是一个重要的概念&#xff0c;它涉及到数据在内存中的存储方式&#xff0c;以及如何优化内存访问的效率。往往一门语言的内存布局以及对齐方式决定了一门语言的性能&#xff0c;因此学会并深入理解rust中内存布局会让我们写出高性能的rust代码&a…

闯关leetcode——3206. Alternating Groups I

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/alternating-groups-i/description/ 内容 There is a circle of red and blue tiles. You are given an array of integers colors. The color of tile i is represented by colors[i]: colors[i…

HTML5和CSS3的进阶_HTML5和CSS3的新增特性

目录 HTML5的新特性 1. HTML5 的新特性 1.1 HTML5 新增的语义化标签 1.2 HTML5 新增的多媒体标签 1. 视频 2. 音频 3. 多媒体标签总结 1.3 HTML5 新增的 input 类型 1.4 HTML5 新增的表单属性 required 必须输入信息&#xff0c;不能为空&#xff1b; 重点&#xf…

小马识途营销顾问谈百科词条建立的注意事项

百度百科是百度旗下的产品&#xff0c;它就好比是一本网络百科全书&#xff0c;当我们在网络上搜索某个人物或是企业的时候&#xff0c;如果他们有创建百度百科的话就可以搜出来百度百科词条。词条上展示的荣誉、贡献、社会评价或是企业组织架构等方面可以在无形之中提升人物或…

6、If、While、For、Switch

6、If、While、For、Switch 一、If 1、if-else if (boolean) {代码块 } else if (boolean) {代码块 } else if (boolean) {代码块 } else { // 默认情况代码块 }关于IDEA单元测试控制台不能输入数据的问题&#xff1a; https://blog.csdn.net/m0_72900498/article/details/…

华为路由器DHCP配置

一、单臂路由结构的DHCP 1.启动设备 2.将pc设为DHCP获取IP地址 3.交换机创建vlan并设置模式 [SW1]vlan batch 10 20 [SW1]int g0/0/1 [SW1-GigabitEthernet0/0/1]port link-type trunk [SW1-GigabitEthernet0/0/1]port trunk allow-pass vlan all [SW1-GigabitEthernet0…

【Vue】Vue3.0(十七)Vue 3.0中Pinia的深度使用指南(基于setup语法糖)

上篇文章&#xff1a; 【Vue】Vue3.0&#xff08;十一&#xff09;Vue 3.0 中 computed 计算属性概念、使用及示例 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月10日15点23分 文章…

element plus el-form自定义验证输入框为纯数字函数

element plus 的el-form 使用自定义验证器&#xff0c;验证纯数字&#xff0c;禁止输入小数、中文、字母、特殊符号。input的maxlength为最大输入多少位长度 效果图 <el-form ref"dataFormRef" :model"dataForm" :rules"dataRules" label-w…