Spring Boot 深度学习笔记:从入门到精通的全面指南

Spring Boot 是由 Pivotal 团队开发的基于 Spring 框架的一个项目。它的目标是简化新 Spring 应用的初始搭建和开发过程,通过提供一系列默认配置和快速启动的能力,使开发者能够快速上手,减少配置的复杂性。这篇学习笔记将详细介绍 Spring Boot 的基本概念、核心功能以及实际应用示例,帮助初学者全面了解并掌握 Spring Boot。

一、Spring Boot 简介

1.1 什么是 Spring Boot

Spring Boot 是 Spring 框架的一个子项目,目的是简化 Spring 应用的创建、配置和部署。它通过自动配置、生产准备的功能以及多种开箱即用的非功能性特性,如嵌入式服务器、度量监控和健康检查等,极大地简化了 Spring 应用的开发过程。

1.2 Spring Boot 的优势

  • 快速开发:Spring Boot 提供了许多开箱即用的功能,简化了配置和依赖管理,减少了开发时间。
  • 自动配置:通过自动配置,Spring Boot 能够智能地根据项目的依赖关系进行配置,减少了手动配置的麻烦。
  • 嵌入式服务器:支持嵌入式 Tomcat、Jetty 等服务器,简化了部署流程。
  • 生产准备功能:提供了内置的监控、健康检查和度量等功能,方便对应用的管理和维护。
  • 强大的社区和文档支持:Spring Boot 拥有丰富的文档和庞大的社区支持,开发者可以轻松找到解决方案。

二、Spring Boot 的基本概念

2.1 自动配置

Spring Boot 的核心之一是自动配置(Auto Configuration)。自动配置尝试猜测你需要的配置,并自动完成这些配置,从而减少开发者的配置工作。Spring Boot 通过 @EnableAutoConfiguration 注解启用自动配置。

2.2 Starter POMs

Starter POMs 是一组方便的依赖描述符,可以帮助你快速构建 Spring 应用。例如,spring-boot-starter-web 包含了开发 web 应用所需的常见依赖项,如 Spring MVC、Tomcat 等。

2.3 嵌入式服务器

Spring Boot 支持嵌入式服务器,使得应用可以以独立的方式运行,而不需要外部的应用服务器。这使得部署和测试变得更加简单和便捷。

2.4 Spring Boot CLI

Spring Boot CLI 是一个命令行工具,可以用来快速创建和运行 Spring 应用。它支持 Groovy 脚本,能够快速原型化应用。

三、Spring Boot 的核心功能

3.1 创建 Spring Boot 项目

创建 Spring Boot 项目有多种方式:

  • Spring Initializr:一个在线生成器,可以生成一个基本的 Spring Boot 项目结构。
  • IDE 插件:如 IntelliJ IDEA 和 Eclipse 都提供了创建 Spring Boot 项目的功能。
  • 手动创建:通过创建一个 Maven 或 Gradle 项目,并添加 Spring Boot 依赖。
3.1.1 使用 Spring Initializr

Spring Initializr 是一个 web 工具,可以生成一个带有基础配置的 Spring Boot 项目。你可以访问 Spring Initializr,选择需要的依赖项,生成并下载项目。

3.1.2 在 IDE 中创建项目

大多数现代的 IDE,如 IntelliJ IDEA 和 Eclipse,都提供了创建 Spring Boot 项目的模板。以下是使用 IntelliJ IDEA 创建 Spring Boot 项目的步骤:

  1. 打开 IntelliJ IDEA,选择 “Create New Project”。
  2. 选择 “Spring Initializr”。
  3. 配置项目的基本信息(如 Group、Artifact、名称等)。
  4. 选择需要的依赖项(如 Spring Web、Spring Data JPA 等)。
  5. 点击 “Finish”,IDE 会生成并导入项目。

3.2 配置文件

Spring Boot 使用 application.propertiesapplication.yml 文件来配置应用。配置文件位于 src/main/resources 目录下。

3.2.1 使用 application.properties

application.properties 是一个键值对格式的配置文件。以下是一些常见的配置示例:

# 服务器配置
server.port=8080# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret# 日志级别配置
logging.level.org.springframework=INFO
3.2.2 使用 application.yml

application.yml 是一个 YAML 格式的配置文件,具有更好的可读性。以下是相同配置的 YAML 示例:

server:port: 8080spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: secretlogging:level:org.springframework: INFO

3.3 日志管理

Spring Boot 默认使用 SLF4J 和 Logback 作为日志框架。你可以通过配置文件来管理日志级别和格式。

3.3.1 配置日志级别

你可以在 application.propertiesapplication.yml 中配置日志级别。例如:

logging.level.org.springframework=INFO
logging.level.com.example.myapp=DEBUG
logging:level:org.springframework: INFOcom.example.myapp: DEBUG
3.3.2 自定义日志格式

你可以在 src/main/resources 目录下创建一个 logback-spring.xml 文件,自定义日志格式。例如:

<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="INFO"><appender-ref ref="STDOUT" /></root>
</configuration>

3.4 Web 开发

Spring Boot 提供了强大的 web 开发支持,包括 Spring MVC 和 RESTful 服务的开发。

3.4.1 Spring MVC

Spring MVC 是一个强大的 web 框架,支持开发传统的基于服务器的 web 应用。以下是一个简单的控制器示例:

@RestController
public class HelloController {@GetMapping("/hello")public String sayHello() {return "Hello, World!";}
}
3.4.2 RESTful 服务

Spring Boot 使得创建 RESTful 服务变得非常简单。以下是一个简单的 RESTful 服务示例:

@RestController
@RequestMapping("/api")
public class UserController {@GetMapping("/users/{id}")public User getUser(@PathVariable Long id) {return new User(id, "John Doe");}@PostMapping("/users")public User createUser(@RequestBody User user) {// 逻辑省略return user;}
}

3.5 数据访问

Spring Boot 提供了对多种数据访问技术的支持,包括 JPA、JDBC 和 NoSQL 数据库。

3.5.1 Spring Data JPA

Spring Data JPA 简化了基于 JPA 的数据访问。以下是一个示例:

  1. 添加依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
  1. 配置数据源:

application.properties 中添加数据源配置:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.jpa.hibernate.ddl-auto=update
  1. 创建实体类和仓库接口:
@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;// getters and setters
}public interface UserRepository extends JpaRepository<User, Long> {
}
  1. 使用仓库接口:
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User getUser(Long id) {return userRepository.findById(id).orElse(null);}public User createUser(User user) {return userRepository.save(user);}
}

3.6 安全

Spring Boot 提供了对 Spring Security 的集成,简化了安全相关的配置和开发。

3.6.1 添加依赖

pom.xml 中添加 Spring Security 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
3

.6.2 基本安全配置

Spring Boot 默认提供了基本的安全配置,如表单登录和基于 HTTP Basic 的认证。以下是一个自定义安全配置的示例:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password("{noop}password").roles("USER").and().withUser("admin").password("{noop}admin").roles("ADMIN");}
}

3.7 测试

Spring Boot 提供了丰富的测试支持,包括单元测试和集成测试。

3.7.1 单元测试

Spring Boot 提供了 @SpringBootTest 注解,用于集成测试。以下是一个示例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void testGetUser() {User user = userService.getUser(1L);assertNotNull(user);assertEquals("John Doe", user.getName());}
}
3.7.2 MockMvc

Spring Boot 提供了 MockMvc,用于模拟 HTTP 请求进行测试。以下是一个示例:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {@Autowiredprivate MockMvc mockMvc;@Testpublic void testGetUser() throws Exception {mockMvc.perform(get("/api/users/1")).andExpect(status().isOk()).andExpect(jsonPath("$.name").value("John Doe"));}
}

3.8 配置管理

Spring Boot 提供了灵活的配置管理机制,可以根据不同的环境进行配置。你可以使用 @ConfigurationProperties 注解来管理复杂的配置。

3.8.1 配置属性类

创建一个配置属性类,并使用 @ConfigurationProperties 注解:

@ConfigurationProperties(prefix = "app")
public class AppProperties {private String name;private String description;// getters and setters
}
3.8.2 加载配置

在主配置类中加载配置属性:

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

3.9 Actuator

Spring Boot Actuator 提供了对应用运行时状态的监控和管理功能。它包括多个端点,可以用来检查应用的健康状况、查看应用信息、管理日志级别等。

3.9.1 添加依赖

pom.xml 中添加 Actuator 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3.9.2 启用 Actuator 端点

application.properties 中启用所需的 Actuator 端点:

management.endpoints.web.exposure.include=health,info
3.9.3 访问 Actuator 端点

启动应用后,可以通过浏览器或其他工具访问 Actuator 端点。例如,访问 /actuator/health 端点可以查看应用的健康状况。

3.10 部署

Spring Boot 应用可以打包成独立的 JAR 文件,并可以直接运行,也可以部署到传统的应用服务器中。

3.10.1 打包成 JAR 文件

你可以使用 Maven 或 Gradle 将 Spring Boot 应用打包成 JAR 文件。以下是使用 Maven 的示例:

mvn clean package

生成的 JAR 文件位于 target 目录下,你可以通过以下命令运行应用:

java -jar target/myapp-0.0.1-SNAPSHOT.jar
3.10.2 部署到应用服务器

你也可以将 Spring Boot 应用打包成 WAR 文件,并部署到传统的应用服务器(如 Tomcat、Jetty)。以下是使用 Maven 打包成 WAR 文件的示例:

pom.xml 中添加插件配置:

<packaging>war</packaging><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

运行以下命令打包成 WAR 文件:

mvn clean package

生成的 WAR 文件位于 target 目录下,可以部署到应用服务器中。

四、Spring Boot 实践示例

4.1 创建一个简单的 Web 应用

在本节中,我们将创建一个简单的 Spring Boot Web 应用,包括用户注册和登录功能。

4.1.1 项目结构

首先,创建一个新的 Spring Boot 项目,添加以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
4.1.2 数据库配置

application.properties 文件中配置数据源:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.jpa.hibernate.ddl-auto=update
4.1.3 实体类和仓库接口

创建用户实体类和仓库接口:

@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;// getters and setters
}public interface UserRepository extends JpaRepository<User, Long> {User findByUsername(String username);
}
4.1.4 服务层

创建用户服务类:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User register(User user) {// 注册逻辑return userRepository.save(user);}public User findByUsername(String username) {return userRepository.findByUsername(username);}
}
4.1.5 控制器

创建用户控制器:

@RestController
@RequestMapping("/api")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public User register(@RequestBody User user) {return userService.register(user);}@GetMapping("/user/{username}")public User getUser(@PathVariable String username) {return userService.findByUsername(username);}
}
4.1.6 安全配置

创建安全配置类:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate UserService userService;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder());}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/api/register").permitAll().anyRequest().authenticated().and().formLogin().permitAll().and().logout().permitAll();}
}
4.1.7 测试

测试注册和登录功能:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {@Autowiredprivate MockMvc mockMvc;@Testpublic void testRegister() throws Exception {mockMvc.perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content("{\"username\": \"user\", \"password\": \"password\"}")).andExpect(status().isOk());}@Testpublic void testLogin() throws Exception {mockMvc.perform(post("/login").param("username", "user").param("password", "password")).andExpect(status().isOk());}
}

五、总结

Spring Boot 是一个功能强大且易于使用的框架,极大地简化了 Spring 应

用的开发和配置过程。通过本篇学习笔记,我们详细介绍了 Spring Boot 的基本概念、核心功能以及实际应用示例。希望这些内容能帮助你快速上手并掌握 Spring Boot 的开发技巧。在实际项目中,Spring Boot 的灵活性和强大功能将助你高效地构建和维护应用。

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

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

相关文章

添加Microsoft.VisualStudio.TestTools.UnitTesting命名空间

创建“单元测试项目”&#xff0c;则自动添加 Microsoft.VisualStudio.TestTools.UnitTesting 命名空间

文心一言使用技巧

前言 文心一言是一款基于人工智能技术的自然语言处理工具&#xff0c;它可以帮助用户生成、编辑和优化各种类型的文本。无论是写作、翻译、总结&#xff0c;还是进行信息提取和数据分析&#xff0c;文心一言都能提供强大的支持。本文将详细介绍文心一言的使用技巧&#xff0c;…

例54:Draw使用

建立一个控制台工程&#xff0c;输入代码&#xff1a; Screen 13 移动到&#xff08;50,50&#xff09;而不绘图 Draw "BM 50,50" B:移动但不绘制,M:移动到指定位置 将绘图颜色设置为2&#xff08;绿色&#xff09; Draw "C2" C将颜色改为n …

计算机网络 —— 网络层 (路由协议)

计算机网络 —— 网络层 &#xff08;路由协议&#xff09; 什么是路由协议内部网关协议RIP关键特性 OSPF主要特点 外部网关协议BGP关键特性 我们今天来看路由协议&#xff1a; 什么是路由协议 路由协议是网络设备&#xff08;主要是路由器&#xff09;用来决定数据包在网络中…

【Python入门与进阶】Anaconda环境配置

目录 1.Conda换源 2.pip换源 3.环境管理 4.可视化界面完成上述操作 1.Conda换源 1.1.打开Anaconda Powershell Prompt 1.2.在界面中输入以下命名&#xff08;加入清华源并设置搜索优先级&#xff09;&#xff1a; conda config --add channels https://mirrors.ustc.edu.…

【数据结构】二叉树专题

前言 本篇博客我们来看一些二叉树的经典题型&#xff0c;也是对上篇博客的补充 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ​ 目录 1.单值二叉树 …

谈谈微服务之间的授权方案

微服务架构中&#xff0c;服务与服务之间的授权是一个关键问题&#xff0c;需要确保服务间的调用是安全且符合权限控制的。以下是一些常见的微服务之间授权方案&#xff1a; API网关: 在微服务架构中&#xff0c;API网关通常作为所有服务的入口点。它可以处理身份验证和授权&a…

计网总结☞网络层

.................................................. 思维导图 ........................................................... 【Wan口和Lan口】 WAN口&#xff08;Wide Area Network port&#xff09;&#xff1a; 1)用于连接外部网络&#xff0c;如互联…

stm32中外部中断控制Led亮灭

说明&#xff1a;外部中断的方式通过按键来实现&#xff0c;stm32的配置为江科大stm32教程中的配置。 1.内容&#xff1a; 通过中断的方式&#xff0c;按下B15按键Led亮&#xff0c;按下B13按键Led灭。 2.硬件设计&#xff1a; 3.代码&#xff1a; 3.1中断底层 EXTI.c #i…

1164. 指定日期的产品价格

1164. 指定日期的产品价格 题目链接&#xff1a;1164. 指定日期的产品价格 代码如下&#xff1a; # Write your MySQL query statement below select p1.product_id,ifnull(new_price,10) as price from (select distinct product_idfrom Products )as p1 -- 所有的产品 left…

SpringBoot整合RabbitMQ消息中间件,实现延迟队列和死信队列

在现代的分布式系统中&#xff0c;消息队列作为一种重要的中间件&#xff0c;广泛应用于系统解耦、流量削峰、异步处理等场景。而RabbitMQ作为其中一款流行的消息队列中间件&#xff0c;因其高性能和丰富的功能受到众多开发者的青睐。本文将详细介绍如何在SpringBoot项目中整合…

笔记95:车辆横向动力学方程转化为误差形式 -- 详细推导过程

1. 非误差型车辆横向动力学方程 注&#xff1a;关于轮胎侧偏刚度的正负 深蓝课程推导得到的车辆横向动力学返程使用的轮胎侧偏刚度是默认为正数&#xff1b;老王课程推导得到的车辆横向动力学方程使用的轮胎侧偏刚度是默认为负数&#xff1b; 1.1 深蓝课程推导得到的方程&…

如何计算 GPT 的 Tokens 数量?

基本介绍 随着人工智能大模型技术的迅速发展&#xff0c;一种创新的计费模式正在逐渐普及&#xff0c;即以“令牌”&#xff08;Token&#xff09;作为衡量使用成本的单位。那么&#xff0c;究竟什么是Token呢&#xff1f; Token 是一种将自然语言文本转化为计算机可以理解的…

kafka集成flink api编写教程

1.引入依赖&#xff08;pox.xml&#xff09; <dependencies><dependency><groupId>org.apache.flink</groupId><artifactId>flink-java</artifactId><version>1.13.6</version></dependency><dependency><gro…

【C++ | 拷贝赋值运算符函数】一文了解C++的 拷贝赋值运算符函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-09 1…

对WEB标准以及W3C的理解与认识

Web标准简单来说可以分为结构&#xff0c;表现&#xff0c;行为&#xff1a; 结构&#xff08;HTML&#xff09;: HTML&#xff08;HyperText Markup Language&#xff09;定义了网页的结构和内容。它通过各种标签来组织信息&#xff0c;如标题、段落、图像、链接等。HTML 提供…

antd DatePicker 日期 与 时间 分开选择

自定义组件 import { DatePicker } from "antd"; import dayjs from "dayjs"; import { FC, useRef } from "react";/*** 日期 与 时间 分开选择** 版本号: * "antd": "^5.17.4",* "dayjs": "^1.11.11"…

树莓派debain 12更换apt-get源到阿里源

1、备份 总共需要备份两个文件 a、/etc/apt/sources.list.d/raspi.list b、/etc/apt/sources.list 2、删除上述两个文件内到所有内容&#xff0c;然后添加如下内容 /etc/apt/sources.list.d/raspi.list deb https://mirrors.aliyun.com/debian/ bookworm main non-free non…

给gRPC增加负载均衡功能

在现代的分布式系统中&#xff0c;负载均衡是确保服务高可用性和性能的关键技术之一。而gRPC作为一种高性能的RPC框架&#xff0c;自然也支持负载均衡功能。本文将探讨如何为gRPC服务增加负载均衡功能&#xff0c;从而提高系统的性能和可扩展性。 什么是负载均衡&#xff1f; …

域名的端口号范围

域名的端口号范围是从0到65535。这些端口可以大致分为两类&#xff1a; 知名端口&#xff08;Well-Known Ports&#xff09;&#xff1a;范围从0到1023。这些端口号一般固定分配给一些服务&#xff0c;如21端口分配给FTP服务&#xff0c;25端口分配给SMTP&#xff08;简单邮件…