Java Spring Boot: 极简配置与快速开发的利器

引言:

Java Spring Boot是一款开源的Java框架,它以极简配置和快速开发为特点,帮助开发者轻松构建基于Spring框架的应用程序。本文将介绍Spring Boot的核心特性,并结合案例和代码,展示其在简化配置、内嵌服务器、自动化依赖管理、健康检查与度量指标、集成测试支持和外部化配置等方面的优势。

1. 简化配置

Spring Boot采用了自动配置和约定优于配置的原则,通过默认的配置和自动扫描机制,减少了开发者需要手动配置的工作量。开发者只需少量的配置即可使应用程序运行起来,大大简化了配置的过程。

案例:下面的代码展示了如何创建一个简单的Spring Boot应用程序,并通过自动配置的方式来实现数据库访问。

@SpringBootApplication
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}@RestController
public class MyController {@Autowiredprivate UserRepository userRepository;@GetMapping("/users")public List<User> getUsers() {return userRepository.findAll();}
}@Repository
public interface UserRepository extends JpaRepository<User, Long> {// 省略其他方法
}@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private Integer age;// 省略getter和setter方法
}

2. 内嵌服务器

Spring Boot内置了多种常用的Web服务器,如Tomcat、Jetty等,开发者无需单独安装和配置服务器,可以直接运行应用程序。只需将应用程序打包成可执行的jar文件,就可以直接在内嵌的服务器上运行,简化了部署和运行的过程。

案例:下面的代码展示了如何使用Spring Boot内嵌的Tomcat服务器来运行一个简单的Web应用程序。

@SpringBootApplication
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}@RestController
public class HelloController {@GetMapping("/hello")public String sayHello() {return "Hello, Spring Boot!";}
}

3. 自动化依赖管理

Spring Boot引入了起步依赖(Starter)的概念,通过添加相关的起步依赖,自动导入所需的依赖库。起步依赖是一组关联的依赖库的集合,使得依赖管理更加简单和便捷。开发者只需关注自己需要的功能,无需关心具体的依赖库和版本号。

案例:下面的代码展示了如何通过起步依赖来自动导入Spring Web和MySQL数据库的依赖。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
</dependencies>

4. 健康检查和度量指标

Spring Boot集成了Actuator模块,提供了健康检查和度量指标的功能。通过暴露应用程序的健康检查接口和度量指标接口,开发者可以监控应用程序的运行状态和性能指标,及时发现和解决问题。

案例:下面的代码展示了如何通过Actuator来实现应用程序的健康检查和度量指标。

@SpringBootApplication
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}@RestController
public class HealthCheckController {@GetMapping("/health")public String checkHealth() {return "OK";}
}@Configuration
public class ActuatorConfig {@Beanpublic HealthIndicator customHealthIndicator() {return () -> {// 自定义的健康检查逻辑return Health.status("UP").build();};}
}

5. 集成测试支持

Spring Boot提供了集成测试支持,可以方便地进行单元测试和集成测试。开发者可以使用Spring Boot提供的测试框架和工具,编写各种类型的测试用例,确保应用程序的质量。支持MockMvc,能够模拟HTTP请求和响应,对Web应用程序进行测试。

案例:下面的代码展示了如何使用Spring Boot的测试框架和MockMvc来进行集成测试。

@SpringBootTest
@AutoConfigureMockMvc
public class MyControllerTest {@Autowiredprivate MockMvc mockMvc;@Testpublic void testGetUsers() throws Exception {mockMvc.perform(get("/users")).andExpect(status().isOk()).andExpect(jsonPath("$[0].name", is("John"))).andExpect(jsonPath("$[0].age", is(25)));}
}

6. 外部化配置

Spring Boot支持外部化配置,开发者可以使用属性文件、环境变量等方式进行配置。应用程序的配置更加灵活和可维护,可以根据不同的环境设置不同的配置,适应不同的需求和场景。

案例:下面的代码展示了如何使用属性文件来配置数据库连接信息。

application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
@SpringBootApplication
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}@RestController
public class MyController {@Value("${spring.datasource.url}")private String dbUrl;@GetMapping("/dburl")public String getDbUrl() {return dbUrl;}
}

案例分析:

假设我们正在开发一个图书管理系统,并使用Spring Boot来构建后端服务。我们需要实现以下功能:

  1. 添加图书:接收图书的标题、作者和价格等信息,并将其保存到数据库中。
  2. 查询图书:根据图书的标题或作者进行模糊查询,并返回符合条件的图书列表。
  3. 更新图书价格:根据图书的ID,接收新的价格,并将其更新到数据库中。
  4. 删除图书:根据图书的ID,从数据库中删除相应的图书记录。

为了实现上述功能,我们需要进行一些基本的配置和编码工作。但是,借助Spring Boot的简化配置特性,我们可以轻松完成这个案例。

首先,我们需要创建一个Spring Boot应用程序的入口类。

@SpringBootApplication
public class BookManagementApplication {public static void main(String[] args) {SpringApplication.run(BookManagementApplication.class, args);}
}

接下来,我们需要创建一个Book实体类,表示图书的信息。

@Entity
public class Book {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String title;private String author;private Double price;// 省略构造函数、getter和setter方法
}

然后,我们需要创建一个BookRepository接口,用于与数据库进行交互。

@Repository
public interface BookRepository extends JpaRepository<Book, Long> {List<Book> findByTitleContainingOrAuthorContaining(String title, String author);
}

接下来,我们需要创建一个BookController类,用于处理图书相关的HTTP请求。

@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate BookRepository bookRepository;@PostMappingpublic Book addBook(@RequestBody Book book) {return bookRepository.save(book);}@GetMappingpublic List<Book> searchBooks(@RequestParam(required = false) String keyword) {if (keyword != null) {return bookRepository.findByTitleContainingOrAuthorContaining(keyword, keyword);}return bookRepository.findAll();}@PutMapping("/{id}")public Book updateBookPrice(@PathVariable Long id, @RequestParam Double price) {Book book = bookRepository.findById(id).orElse(null);if (book != null) {book.setPrice(price);return bookRepository.save(book);}return null;}@DeleteMapping("/{id}")public void deleteBook(@PathVariable Long id) {bookRepository.deleteById(id);}
}

最后,我们需要创建一个application.properties文件,并配置数据库连接信息。

spring.datasource.url=jdbc:mysql://localhost:3306/book_db
spring.datasource.username=root
spring.datasource.password=123456

通过以上配置和代码,我们就完成了一个基于Spring Boot的图书管理系统。

练习题:

  1. 如何使用Spring Boot的自动配置特性来简化数据库连接的配置?
  2. 什么是起步依赖(Starter)?如何使用起步依赖来自动导入所需的依赖库?
  3. 如何使用Spring Boot的约定优于配置特性来减少配置工作量?
  4. 在上述案例中,如何实现根据图书的标题或作者进行模糊查询?
  5. 在上述案例中,如何实现根据图书的ID更新图书的价格?
  6. 在上述案例中,如何实现根据图书的ID删除图书记录?

答案:

  1. 使用Spring Boot的自动配置特性,我们可以在application.properties文件中配置数据库连接的相关信息,如数据库的URL、用户名和密码等。Spring Boot会根据这些配置自动创建数据源,并将其注入到应用程序中的Repository类中,从而使得我们可以方便地进行数据库操作。

  2. 起步依赖(Starter)是一种特殊的依赖,它能够自动导入所需的依赖库。在使用起步依赖时,我们只需要在项目的pom.xml文件中添加对应的起步依赖,然后Maven或Gradle会自动下载并导入所需的依赖库。例如,在Spring Boot中,我们可以使用"spring-boot-starter-web"起步依赖来自动导入Spring MVC和相关的依赖库。

  3. Spring Boot的约定优于配置特性意味着我们可以通过遵循一些约定来减少配置的工作量。例如,在Spring Boot中,默认的配置文件名是application.properties,如果我们将配置文件命名为application.properties并将其放置在classpath下的根目录下,Spring Boot会自动读取该配置文件中的配置项,并将其应用到应用程序中。

  4. 在上述案例中,我们可以通过在BookRepository接口中定义一个findByTitleContainingOrAuthorContaining方法,使用Spring Data JPA提供的命名查询来实现根据图书的标题或作者进行模糊查询。具体代码如下:

@Repository
public interface BookRepository extends JpaRepository<Book, Long> {List<Book> findByTitleContainingOrAuthorContaining(String title, String author);
}
  1. 在上述案例中,我们可以在BookController类中定义一个@PutMapping方法,接收图书的ID和新的价格作为参数,然后通过调用bookRepository.findById方法找到相应的图书记录,并更新其价格。具体代码如下:
@PutMapping("/{id}")
public Book updateBookPrice(@PathVariable Long id, @RequestParam Double price) {Book book = bookRepository.findById(id).orElse(null);if (book != null) {book.setPrice(price);return bookRepository.save(book);}return null;
}
  1. 在上述案例中,我们可以在BookController类中定义一个@DeleteMapping方法,接收图书的ID作为参数,然后通过调用bookRepository.deleteById方法删除相应的图书记录。具体代码如下:
@DeleteMapping("/{id}")
public void deleteBook(@PathVariable Long id) {bookRepository.deleteById(id);
}

综上所述,Java Spring Boot框架通过简化配置、内嵌服务器、自动化依赖管理、健康检查和度量指标、集成测试支持和外部化配置等特性,极大地提高了开发效率和应用程序的质量。开发者能够专注于业务逻辑的开发,而无需花费过多的时间和精力在繁琐的配置和部署上。无论是Web应用、RESTful服务、批处理任务还是消息队列等,Spring Boot都能够提供强力支持,成为Java开发者的首选框架。

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

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

相关文章

C++编程法则365天一天一条(14)sizeof运算符使用

文章目录 基本用法失效的多态数组就是数组使用限制作用于空class作用于引用基本用法 sizeof运算符用于查询对象或类型的大小。它在编译时计算,并返回以字节为单位的对象或类型的大小。 在某些情况下,我们需要知道对象的实际大小。例如,当我们分配内存或操作具有特定大小要…

qml 无法修改listview表头控件文本

比如在Listview的表头设置了一个复选框&#xff0c;之后想要在其他控件中动态修改复选框的文本&#xff0c;通过id来修改无效&#xff0c;因为它在表头内&#xff0c;对其他控件来说未定义。可以采用一个外部属性来解决&#xff1a; Window {width: 400height: 400visible: tr…

[2023.09.24]: 今天差点又交白卷

今天周日&#xff0c;搞定了家里装修的一件事情&#xff0c;周末的事特别多&#xff0c;总算在10点的时候&#xff0c;解决了昨天那个输入焦点设置失败的问题。 在探索Rust编写基于web_sys的WebAssembly编辑器&#xff1a;挑战输入光标定位的实践中&#xff0c;我们总结了设置光…

线性代数基础-行列式

一、行列式之前的概念 1.全排列&#xff1a; 把n个不同的元素排成一列&#xff0c;称为n个元素的全排列&#xff0c;简称排列 &#xff08;实际上就是我们所说的排列组合&#xff0c;符号是A&#xff0c;arrange&#xff09; 2.标准序列&#xff1a; 前一项均小于后一项的序列…

[Linux入门]---管理者操作系统

文章目录 1.操作系统概念2.设计操作系统的目的3.操作系统如何进行管理系统调用和库函数概念 1.操作系统概念 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。笼统的理解&#xff0c;操作系统包括&#xff1a; 内核&#xff08;进程管理&#xff0c;内存…

ISP技术概述

原本或许是为了对冲手机系统和APP设计无力感而诞生的拍照功能,现今却成为了众手机厂家除背部设计外为数不多可“卷”的地方,自拍、全景、夜景、小视频等旺盛的需求让这一技术的江湖地位迅速变化。对圈内人士而言,这一波变化带来的后摄、双摄、多摄、暗光、防抖、广角、长焦、…

滑动窗口-求数组的所有连续子数组【学习算法】

滑动窗口-求数组的所有连续子数组【学习算法】 前言版权推荐滑动窗口-求数组的所有连续子数组代码 最后 前言 2023-9-24 22:46:27 以下内容源自《【学习算法】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页…

【android】如何设置LD_LIBRARY_PATH?

目录 一 配置方法 1 进入Android shell 2 使用export命令 3 使用echo命令查看变量是否设置成功 二 扩展 1 LD_LIBRARY_PATH设置多个路径 2 push文件 一 配置方法 android中配置LD_LIBRARY_PATH的方法具体为&#xff1a; 1 进入Android shell adb shell 2 使用export…

ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 1、数据库表方面 在原来sys_notice修改基础上增加一个表叫sys_notice_send 表结构如下&#xff1a; DROP …

AVLoadingIndicatorView - 一个很好的Android加载动画集合

官网 GitHub - HarlonWang/AVLoadingIndicatorView: DEPRECATED 项目简介 AVLoadingIndicatorView is a collection of nice loading animations for Android. You can also find iOS version of this here. Now AVLoadingIndicatorView was updated version to 2.X , If …

GitStats - 统计Git所有提交记录工具

如果你是研发效能组的一员或者在从事 CI/CD 或 DevOps&#xff0c;除了提供基础设施&#xff0c;指标和数据是也是一个很重要的一环&#xff0c;比如需要分析下某个 Git 仓库代码提交情况&#xff1a; 该仓库的代码谁提交的代码最多 该仓库的活跃度是什么样子的 各个时段的提交…

安装Linux虚拟机——以ubuntukylin-16.04.7-desktop-amd64.iso为例

正文 安装VMware 重要提示 安装软件之前&#xff0c;请先退出360、电脑管家等安全类软件&#xff0c;这类软件会阻止我们安装的软件进行注册表注册&#xff0c;很可能导致安装失败。确认物理机&#xff08;也就是你自己使用的电脑&#xff09;的防火墙已经关闭。 下载 打开…

python web编程一:token、session、cookie、密码加解密

1 认证 1 传统的session-cookie机制 HTTP协议是无状态协议&#xff0c;为了解决它产生了cookie和session技术。 浏览器发起第一次请求到服务器&#xff0c;服务器发现浏览器没有提供session id&#xff0c;就认为这是第一次请求&#xff0c;会返回一个新的session id给浏览器…

数据仓库整理

数仓 olap vs oltp OLTP主要用于支持日常的业务操作&#xff0c;如银行交易、电子商务等&#xff0c;强调数据的准确性、实时性和并发性。OLAP主要用于支持复杂的数据分析&#xff0c;如数据仓库、决策支持等&#xff0c;强调数据的维度、聚合和可视化。 将OLTP数据库的数据…

C++之lseek64应用总结(二百三十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

CMU15-445 format\clang-format\clang-tidy 失败

CMU15-445 format\clang-format\clang-tidy 失败 问题修改 问题 -- Setting build type to Debug as none was specified. -- Youre using Clang 14.0.0 CMake Warning at CMakeLists.txt:67 (message):BusTub/main couldnt find clang-format.CMake Warning at CMakeLists.tx…

YouCompleteMe 安装踩坑

Vim里下载完插件后&#xff0c;打开vim&#xff0c;可能遇到以下报错 The ycmd server SHUT DOWN (restart with ‘:YcmRestartServer’). Unexpected exit code 1 没有安装server&#xff0c;进入其目录&#xff0c;C语言类的运行 python3 install.py --clangd-completer --v…

下拉框组件的封装(element ui )

目录 实现思路 创建通用的下拉选择框组件 如何使用这个组件 结语 当你使用Vue.js构建Web应用时&#xff0c;封装可复用组件是提高开发效率和代码可维护性的关键之一。在这篇文章中&#xff0c;我们将探讨如何使用Vue.js来创建一个通用的下拉选择框组件&#xff0c;以及如何…

磁盘检测工具,根据lba查找对应文件

Q: 磁盘检测工具&#xff0c;如何根据损坏的lba查找对应的文件? 1.运行cmd&#xff0c;输入 fsutil fsinfo ntfsinfo e: 2.从上述结果中找到 "每扇区字节数&#xff08;Bytes Per Sector&#xff09;"、"每个簇字节数&#xff08;Bytes Per Cluster&#xff0…

Python中使用EMD(经验模态分解)

在Python中使用EMD&#xff08;经验模态分解&#xff09;进行信号分解时&#xff0c;通常可以设置信号分解的数目。EMD算法的目标是将信号分解成多个称为“本征模态函数”&#xff08;Intrinsic Mode Functions&#xff0c;简称IMF&#xff09;的成分&#xff0c;每个IMF都代表…