Spring Boot 全面指南

Spring Boot 是一个用于简化 Spring 应用程序开发的框架,它通过自动配置和约定优于配置的方式,使得开发者能够更快速地构建生产级别的应用。以下是对 Spring Boot 各个知识点的详细阐述。

1. 什么是 Spring Boot

Spring Boot 是一个开源 Java 框架,旨在简化使用 Spring Framework 开发独立、生产级应用的过程。它通过自动配置、约定优于配置的理念,以及内嵌的服务器等特性,让开发者能够快速上手和部署应用。

1.1 主要特性

  • 自动配置:根据添加的依赖自动配置 Spring 应用,减少手动配置。
  • 内嵌服务器:默认支持 Tomcat、Jetty 和 Undertow,无需额外的应用服务器。
  • 起步依赖:使用起步依赖(Starters)简化依赖管理,减少版本冲突。
  • Actuator:用于监控和管理 Spring Boot 应用,提供多种内置监控功能。

2. 项目结构

2.1 Maven 项目结构

一个标准的 Spring Boot 项目通常遵循以下结构:

my-spring-boot-app/
│
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/example/demo/
│   │   │       ├── DemoApplication.java
│   │   │       └── controller/
│   │   │       └── service/
│   │   │       └── repository/
│   │   └── resources/
│   │       ├── application.properties
│   │       └── static/
│   └── test/
│       └── java/
│           └── com/example/demo/
├── pom.xml

2.2 关键文件

  • DemoApplication.java:主应用类,包含 @SpringBootApplication 注解,作为应用的入口点。
  • application.properties:应用的配置文件,用于定义各类属性。
  • controller/service/repository/:分别用于放置控制器、服务层和数据访问层的类。

3. 创建 Spring Boot 应用

3.1 使用 Spring Initializr

Spring Initializr 是一个便捷的工具,用于生成 Spring Boot 项目骨架。

  1. 访问 Spring Initializr
  2. 填写项目元数据(如 Group、Artifact 等)。
  3. 选择项目类型(Maven/Gradle)。
  4. 选择 Java 版本。
  5. 添加所需依赖(如 Spring Web、Spring Data JPA 等)。
  6. 点击 “Generate” 下载 ZIP 文件,解压后在 IDE 中打开。

3.2 使用 IDE 创建

在 IDE(如 IntelliJ IDEA 或 Eclipse)中,你也可以通过向导创建 Spring Boot 项目。通常会提供选择依赖和配置的选项。

4. 配置 Spring Boot

4.1 application.propertiesapplication.yml

Spring Boot 支持两种主要的配置文件格式:.properties.yml。你可以根据自己的习惯选择。

示例: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=DEBUG
示例:application.yml
server:port: 8080spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: secretlogging:level:org.springframework: DEBUG

4.2 轮廓配置文件

Spring Boot 允许使用不同的配置文件来支持不同的环境。你可以创建多个配置文件,如 application-dev.propertiesapplication-prod.properties,通过 spring.profiles.active 属性来选择当前环境:

spring.profiles.active=dev

4.3 自定义配置属性

你可以自定义属性,并通过 @ConfigurationProperties 注解进行绑定。

示例
@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {private String name;private String version;// getters and setters
}

4.4 访问配置属性

通过 @Value 注解或者 @ConfigurationProperties 类来访问配置属性。

@Service
public class MyService {@Value("${app.name}")private String appName;public void printAppName() {System.out.println("Application Name: " + appName);}
}

5. 自动装配

5.1 了解自动装配

通过 @EnableAutoConfiguration 注解,Spring Boot 会根据应用的依赖自动配置所需的 Beans。这大大减少了开发者的手动配置工作。

5.2 条件注解

Spring Boot 提供了一些条件注解来控制自动装配的行为:

  • @ConditionalOnClass:只有在类路径下存在特定类时,才会装配 Bean。
  • @ConditionalOnMissingClass:只有在类路径下不存在特定类时,才会装配 Bean。
  • @ConditionalOnBean:只有在容器中存在特定 Bean 时,才会装配 Bean。
  • @ConditionalOnProperty:根据配置文件中的属性值来决定是否装配 Bean。
示例
@Bean
@ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true")
public MyFeature myFeature() {return new MyFeature();
}

6. 依赖管理

6.1 使用 Starter 依赖

Spring Boot 提供了众多 Starter 依赖,简化了 Maven 项目的依赖管理。

常见的 Starter 依赖
  • spring-boot-starter-web:用于构建 Web 应用,包括 Spring MVC 和嵌入式 Tomcat。
  • spring-boot-starter-data-jpa:用于 Spring Data JPA 支持。
  • spring-boot-starter-security:用于安全功能。
  • spring-boot-starter-actuator:用于监控和管理 Spring Boot 应用。
示例:Maven 依赖
<dependencies><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>
</dependencies>

6.2 管理版本

pom.xml 中使用 dependencyManagement 元素来管理依赖版本。

<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>3.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

7. 创建 RESTful API

7.1 使用 Controller

创建 RESTful API 主要通过 @RestController 注解来定义控制器类。

示例:基本 REST Controller
@RestController
@RequestMapping("/api")
public class MyController {@GetMapping("/hello")public String hello() {return "Hello, World!";}
}

7.2 请求参数和路径变量

使用 @RequestParam@PathVariable 注解来接收请求参数和路径变量。

示例:路径变量和请求参数
@GetMapping("/greet/{name}")
public String greet(@PathVariable String name, @RequestParam(required = false) String message) {return "Hello, " + name + "!" + (message != null ? " " + message : "");
}

7.3 处理 POST 请求

@PostMapping("/users")
public User createUser(@RequestBody User user) {return userService.createUser(user);
}

7.4 处理错误

使用 @ControllerAdvice@ExceptionHandler 处理全局异常。

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(UserNotFoundException.class)public ResponseEntity<String> handleUserNotFound(UserNotFoundException e) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage());}
}

8. 数据访问

8.1 Spring Data JPA

8.1.1 创建实体类
@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String email;// Getters and Setters
}
8.1.2 创建 Repository 接口

创建一个接口,继承 JpaRepositoryCrudRepository,以获得基本的 CRUD 操作。

import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {// 可以自定义查询方法User findByUsername(String username);
}

8.2 服务层

服务层用于封装业务逻辑,并与数据访问层进行交互。

示例:UserService 类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User createUser(User user) {return userRepository.save(user);}public List<User> getAllUsers() {return userRepository.findAll();}public User getUserById(Long id) {return userRepository.findById(id).orElseThrow(() -> new UserNotFoundException("User not found with id: " + id));}public void deleteUser(Long id) {userRepository.deleteById(id);}
}

8.3 事务管理

Spring Boot 提供了简易的事务管理功能。可以在服务层使用 @Transactional 注解来管理事务。

示例
import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {// ...@Transactionalpublic User updateUser(Long id, User userDetails) {User user = getUserById(id);user.setUsername(userDetails.getUsername());user.setEmail(userDetails.getEmail());return userRepository.save(user);}
}

9. 安全管理

9.1 Spring Security 集成

Spring Boot 可以与 Spring Security 集成,以保护应用和管理用户认证。

9.1.1 添加依赖

pom.xml 中添加 Spring Security 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
9.1.2 基本安全配置

创建一个配置类来定义安全策略。

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/api/public/**").permitAll()  // 公开 API.anyRequest().authenticated()  // 其他请求需要认证.and().httpBasic();  // 使用基本认证}
}

9.2 自定义用户细节服务

实现 UserDetailsService 接口来加载用户的详细信息。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;@Service
public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username);if (user == null) {throw new UsernameNotFoundException("User not found: " + username);}return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());}
}

10. 监控与管理

10.1 使用 Spring Boot Actuator

Spring Boot Actuator 提供了用于监控和管理应用的功能。

10.1.1 添加依赖

pom.xml 中添加 Actuator 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
10.1.2 配置 Actuator

可以在 application.properties 中配置 Actuator 的端点:

management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

10.2 访问 Actuator 端点

在默认情况下,Actuator 端点在 /actuator 下可访问。常用的端点包括:

  • /actuator/health:查看应用的健康状况。
  • /actuator/info:查看应用的信息,如版本、描述等。

11. 测试

11.1 单元测试

Spring Boot 提供了很好的测试支持,可以使用 @SpringBootTest 进行集成测试。

示例:UserService 测试
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;public class UserServiceTest {@InjectMocksprivate UserService userService;@Mockprivate UserRepository userRepository;private User user;@BeforeEachpublic void setUp() {MockitoAnnotations.openMocks(this);user = new User();user.setId(1L);user.setUsername("testuser");user.setEmail("test@example.com");}@Testpublic void testCreateUser() {when(userRepository.save(any(User.class))).thenReturn(user);User createdUser = userService.createUser(user);assertEquals("testuser", createdUser.getUsername());verify(userRepository, times(1)).save(user);}
}

11.2 MockMvc 进行 API 测试

可以使用 MockMvc 对 Controller 进行测试。

示例
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;@SpringBootTest
@AutoConfigureMockMvc
public class MyControllerTest {@Autowiredprivate MockMvc mockMvc;@Testpublic void testHelloEndpoint() throws Exception {mockMvc.perform(get("/api/hello")).andExpect(status().isOk()).andExpect(content().string("Hello, World!"));}
}

12. 部署

12.1 打包应用

使用 Maven 打包应用:

mvn clean package

会在 target 目录下生成一个可执行的 JAR 文件。

12.2 运行应用

通过命令行运行生成的 JAR 文件:

java -jar target/my-spring-boot-app-0.0.1-SNAPSHOT.jar

12.3 部署到云平台

Spring Boot 应用可以轻松部署到各种云平台,如 AWS、Heroku、Azure 等。大多数云平台提供简便的流程来支持 Spring Boot 应用的部署。

总结

Spring Boot 是一个强大的工具,极大地简化了 Java 应用的开发和部署过程。通过上述概述,你应该能理解其基本概念、创建和配置应用的步骤、以及如何实现常见功能。建议深入阅读官方文档,以获得更全面的了解和最新的信息。

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

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

相关文章

Python小游戏14——雷霆战机

首先&#xff0c;你需要确保安装了Pygame库。如果你还没有安装&#xff0c;可以使用pip来安装&#xff1a; bash pip install pygame 代码如下&#xff1a; python import pygame import sys import random # 初始化Pygame pygame.init() # 设置屏幕大小 screen_width 800 scr…

编程之路:蓝桥杯备赛指南

文章目录 一、蓝桥杯的起源与发展二、比赛的目的与意义三、比赛内容与形式四、比赛前的准备五、获奖与激励六、蓝桥杯的影响力七、蓝桥杯比赛注意事项详解使用Dev-C的注意事项 一、蓝桥杯的起源与发展 蓝桥杯全国软件和信息技术专业人才大赛&#xff0c;简称蓝桥杯&#xff0c…

Python3 No module named ‘pymysql‘

在使用python3链接数据库时&#xff0c;总是提示 No module named pymysql 错误&#xff0c;执行pip3 install pymysql后&#xff0c;提示安装成功&#xff0c;但是执行py文件还是提示此错误。 使用python2 执行时&#xff0c;链接数据库正确&#xff0c;百思不得其解 先使用…

SpringBoot调用SOAP接口步骤详解。

1、引入依赖 <dependency><groupId>org.springframework.ws</groupId><artifactId>spring-ws-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</ar…

移远通信闪耀2024香港秋灯展,以丰富的Matter产品及方案推动智能家居产业发展

10月27-30日&#xff0c;2024香港国际秋季灯饰展在香港会议展览中心盛大开展。 作为全球领先的物联网整体解决方案供应商&#xff0c;移远通信再次亮相&#xff0c;并重点展示了旗下支持Matter协议以及亚马逊ACK ( Alexa Connect Kit ) SDK for Matter方案的Wi-Fi模组、低功耗蓝…

【万户软件-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

107. 阴影范围.shadow.camera

上篇文章2.平行光阴影计算讲解过&#xff0c;通过光源的阴影相机属性.shadow.camera,来控制阴影的渲染范围&#xff0c;本节课继续.shadow.camera的讲解。 平行光阴影相机属性.shadow.camera回顾 平行光DirectionalLight的.shadow属性是平行光阴影对象DirectionalLightShadow…

SpringBoot3+SpringSecurity6基于若依系统整合自定义登录流程

SpringBoot3SpringSecurity6基于若依系统整合自定义登录流程 问题背景 在做项目时遇到了要对接统一认证的需求&#xff0c;但是由于框架的不兼容性&#xff08;我们项目是springboot3&#xff0c;jdk17&#xff0c;springsecurity6.1.5&#xff09;等因素&#xff0c;不得不使…

如何解决品牌商和经销商对接的难题

本文分享知名啤酒商大品牌公司如何和经销商的数据进行对接 某啤酒商业务场景&#xff1a;品牌商例如某啤酒商需要推广自己的订货商城助力全国的各大经销商提高营销竞争力 如何解决核心问题之一&#xff1a;商城打通ERP&#xff1f; 根据调研&#xff0c;经销商ERP系统分布情况&…

书生-第四期闯关:完成SSH连接与端口映射并运行hello_world.py

端口映射完成后&#xff0c;访问127.0.0.1&#xff1a;7860成功展示如下界面&#xff1a; 书生浦语大模型实战营 项目地址&#xff1a;https://github.com/InternLM/Tutorial/

ValueError: Object arrays cannot be loaded when allow_pickle=False

文章目录 问题解决方法1&#xff1a;allow_pickleTrue解决方法2&#xff1a;降低numpy版本错误原因&#xff1a;python和numpy版本不兼容 问题 Traceback (most recent call last): File “D:\project\test_st\retrieval\read_npy.py”, line 4, in data np.load(‘mosi0__le…

聆听用户声音的3个方法,挖掘客户真实潜在需求

聆听用户反馈&#xff0c;去挖掘用户真实需求的重要性是企业非常重要的意向工作之一&#xff0c;因为它直接关联到企业的产品开发、市场定位、客户满意度以及最终的商业成果。了解并满足用户的真实需求可以帮助企业创造更有价值的产品和服务&#xff0c;提升用户体验&#xff0…

docker离线安装达梦数据库

文章目录 下载达梦数据库docker镜像上传DM8镜像文件将DM8镜像导入到本地docker镜像仓库中查看本地docker镜像仓库是否存在DM8镜像带参数启动DM8docker启动DM8默认用户名/密码 下载达梦数据库docker镜像 达梦数据库官网 https://www.dameng.com/ 点击下载中心&#xff0c;选择D…

产品宣传册制作成电子产品宣传册用什么软件?

​随着科技的飞速发展&#xff0c;电子产品已经渗透到我们生活的方方面面&#xff0c;电子宣传册作为一种新兴的传播媒介&#xff0c;受到企业的青睐。将传统的纸质产品宣传册制作成电子宣传册&#xff0c;不仅能够降低成本、提高传播效率&#xff0c;还能更好地满足消费者的阅…

linux之网络子系统- TCP连接建立过程 三次握手四次挥手

一、相关实际问题 为什么服务端程序都需要先listen一下半连接队列和全连接队列长度如何确定“Cannot assign requested address”这个报错是怎么回事一个客户端端口可以同时用在两条连接上吗服务端半/全连接队列满了会怎么样新连接的soket内核对象是什么时候建立的建立一条TCP…

[JAVAEE] 多线程的案例(四) - 定时器

目录 一. 什么是定时器? 二. java中的定时器类 三. 定时器的简单使用. 四. 模拟实现定时器 4.1 实现 MyTimerTask 4.2 实现 MyTimer 一. 什么是定时器? 定时器相当于闹钟, 时间到了就执行一些逻辑. 二. java中的定时器类 使用Timer类实例化一个定时器对象. Timer类中的…

Java调用chatgpt

目前openai的chatgpt在国内使用有一定难度&#xff0c;不过国内的大模型在大部分情况下已经不弱于chatgpt&#xff0c;而且还更便宜&#xff0c;又能解决国内最敏感的内容安全问题。本文后续以spring ai调用国内chatgpt厂商实现为例&#xff0c;讲解怎么构建一个java调用chatgp…

海外云手机是什么?对外贸电商有什么帮助?

在外贸电商领域&#xff0c;流量引流已成为卖家们关注的核心问题。越来越多的卖家开始利用海外云手机&#xff0c;通过TikTok等社交平台吸引流量&#xff0c;以推动商品在海外市场的销售。那么&#xff0c;海外云手机到底是什么&#xff1f;它又能为外贸电商卖家提供哪些支持呢…

uniapp 底部导航栏tabBar设置后不显示的问题——已解决

uniapp 底部导航栏tabBar设置后不显示的问题——已解决 网上找了一堆解决办法&#xff0c;挨个对着试吧 解决办法一&#xff1a;tabBar里的list第一项和page中的第一项要相同&#xff0c;确实就能显示了。但是问题来了&#xff0c;page中的第一项是入口页&#xff0c;那就意味…

【AI开源项目】OneAPI -核心概念、特性、优缺点以及如何在本地和服务器上进行部署!

本文将深入探讨OneAPI的核心概念、特性以及如何在本地和服务器上进行部署&#xff0c;帮助开发者更高效地利用这一强大的工具。 文章目录 什么是OneAPI&#xff1f;OneAPI的核心特性 OneAPI的优势与缺点OneAPI的安装与使用教程1. OneAPI的本地构建1.1 下载源代码1.2 构建前端1…