Spring Boot 应用开发:从入门到实战

news2024/10/22 5:16:09

Spring Boot 是一种基于 Spring 框架的开源项目,旨在简化基于 Spring 的开发过程。它通过自动化配置、内嵌服务器以及高效的开发工具,使得开发人员可以更加轻松地构建企业级应用程序。本篇文章将深入探讨 Spring Boot 的核心概念、开发过程以及实际的代码实现,帮助读者掌握 Spring Boot 开发的技巧与最佳实践。

1. Spring Boot 的概述

1.1 什么是 Spring Boot?

Spring Boot 是由 Pivotal 团队开发的一个基于 Spring 的框架,它用于简化 Spring 应用程序的创建和部署。它通过自动化配置和对常见开发任务的简化,使得开发者可以更快地构建出生产级别的应用。

1.2 Spring Boot 的优势

  • 快速入门:通过自动配置和“开箱即用”的理念,减少了配置的复杂性。
  • 内嵌服务器:内置 Tomcat、Jetty 等服务器,开发者可以直接运行应用程序,无需额外的配置。
  • 生产级监控:集成 Actuator,提供丰富的监控和管理端点。
  • 强大的生态系统:可以无缝集成 Spring 全家桶及第三方库,满足各种企业应用场景需求。

2. 环境搭建与项目创建

2.1 环境准备

要开始 Spring Boot 开发,首先需要准备以下工具:

  • Java JDK 8 及以上:Spring Boot 需要 JDK 8 或更高版本。
  • Maven 或 Gradle:用于管理项目的依赖和构建。
  • IDE:推荐使用 IntelliJ IDEA 或 Eclipse,这些 IDE 都有很好的 Spring Boot 支持。

2.2 使用 Spring Initializr 创建项目

Spring Initializr 是一个便捷的工具,用于生成 Spring Boot 项目骨架。可以通过 Spring Initializr 官网 创建,也可以在 IntelliJ IDEA 中使用插件来创建项目。

生成项目时,选择如下配置:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 最新的稳定版
  • Dependencies: Spring Web, Spring Data JPA, H2 Database

生成项目后,将其导入到您的 IDE 中,您会看到一个标准的 Spring Boot 项目结构。

3. Spring Boot 的核心概念

3.1 自动配置与注解

Spring Boot 提供了大量的自动化配置,使得开发人员只需要编写少量的配置代码。以下是几个常用的注解:

  • @SpringBootApplication:这是一个组合注解,等价于 @Configuration, @EnableAutoConfiguration, @ComponentScan。它标识一个类是 Spring Boot 应用的入口。
  • @RestController:结合了 @Controller@ResponseBody,用于开发 RESTful 风格的 API。
  • @RequestMapping:用于定义请求路径,可以应用于类或方法上。

3.2 代码实现:Hello World

我们先从一个简单的“Hello World”示例开始,来熟悉 Spring Boot 的基本用法。

在生成的 Spring Boot 项目中,我们可以创建一个简单的 REST API,如下所示:

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class HelloController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, Spring Boot!";
    }
}

HelloController 类中,@RestController 注解表明这是一个 REST 控制器,@RequestMapping@GetMapping 用于映射请求路径。当访问 http://localhost:8080/api/hello 时,将返回“Hello, Spring Boot!”的字符串。

4. 数据库集成与操作

4.1 使用 Spring Data JPA 进行数据库操作

Spring Data JPA 是 Spring Boot 的数据访问解决方案,它使得我们可以通过简单的接口来完成对数据库的操作。

4.1.1 配置数据库连接

src/main/resources/application.properties 文件中,添加如下配置来连接内存数据库 H2:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.h2.console.enabled=true

这段配置将启动一个内存数据库 H2,并开启 H2 控制台,您可以通过 http://localhost:8080/h2-console 访问数据库控制台。

4.1.2 实体类与 JPA 仓库

首先,创建一个简单的实体类 User,用来表示数据库中的用户信息:

package com.example.demo.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

然后,创建一个 JPA 仓库接口,用于管理 User 实体:

package com.example.demo.repository;

import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
4.1.3 创建 REST API 来操作用户数据

接下来,创建一个 UserController,通过 REST API 来管理用户数据:

package com.example.demo.controller;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
    }

    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User userDetails) {
        User user = userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
        user.setName(userDetails.getName());
        user.setEmail(userDetails.getEmail());
        return userRepository.save(user);
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userRepository.deleteById(id);
    }
}
  • @GetMapping 获取所有用户。
  • @PostMapping 创建一个新用户。
  • @GetMapping("/{id}") 获取指定 ID 的用户。
  • @PutMapping("/{id}") 更新用户信息。
  • @DeleteMapping("/{id}") 删除用户。

通过这些简单的 API,我们可以对用户数据进行基本的 CRUD 操作。

5. Spring Boot 安全性

5.1 使用 Spring Security 保护应用

Spring Security 是一个强大的安全框架,可以用于保护 Spring Boot 应用。我们可以使用它来添加身份验证和授权功能。

首先,在 pom.xml 中添加 Spring Security 依赖:

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

然后,创建一个简单的配置类来设置安全规则:

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/api/users/**").authenticated()
                .anyRequest().permitAll()
                .and()
            .httpBasic();
        return http.build();
    }
}

在这个配置中,所有 /api/users/** 路径的请求都需要身份验证,而其他路径可以匿名访问。

6. Spring Boot 测试

Spring Boot 提供了一套完整的测试工具,使得测试变得简单高效。我们可以使用 @SpringBootTest 注解来编写集成测试。

package com.example.demo;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
public class UserRepositoryTests {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void testCreateUser() {
        User user = new User();
        user.setName("Test User");
        user.setEmail("test@example.com");
        User savedUser = userRepository.save(user);

        assertThat(savedUser.getId()).isNotNull();
        assertThat(savedUser.getName()).isEqualTo("Test User");
    }
}

在这个测试中,我们创建了一个用户,并验证了它是否被成功保存。

7. Spring Boot 的部署

7.1 打包为 JAR 文件

Spring Boot 应用通常打包为一个独立的 JAR 文件,其中包含所有依赖和内嵌的服务器。使用 Maven,可以通过以下命令打包应用:

mvn clean package

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

java -jar target/demo-0.0.1-SNAPSHOT.jar

7.2 部署到云平台

Spring Boot 应用可以非常方便地部署到各种云平台,例如 AWS、Azure 或 Google Cloud。通常可以将 JAR 文件上传到服务器并运行,或者使用 Docker 构建容器镜像并进行部署。

8. 总结

通过本文的详细讲解,我们了解了 Spring Boot 的基础知识、如何创建 REST API、如何集成数据库、如何使用 Spring Security 来保护应用以及如何进行测试和部署。Spring Boot 的简洁性和强大功能使得它成为构建现代企业应用的绝佳选择。

Spring Boot 的生态系统还包括诸如 Spring Cloud、Spring Batch 等其他模块,可以用来构建复杂的分布式系统和批处理任务。希望本文能够帮助您掌握 Spring Boot 的基本开发流程,为后续深入学习和实践打下基础。

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

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

相关文章

Win安装Redis

目录 1、下载 2、解压文件并修改名称 3、前台简单启动 4、将redis设置成服务后台启动 5、命令启停redis 6、配置文件设置 1、下载 【下载地址】 2、解压文件并修改名称 3、前台简单启动 redis-server.exe redis.windows.conf 4、将redis设置成服务后台启动 redis-server -…

xlnt加载excel报错:xl/workbook.xml:2:2581: error: attribute ‘localSheetId‘ expected

解决方案 大家不一定能看懂&#xff0c;地址里说的啥意思&#xff0c;地址过去主要说明了从https://github.com/musshorn/xlnt/tree/issue_685合入可以解决问题&#xff0c;后面再想推送到官方地址&#xff0c;但没人维护了。 我这边直接给大家说一个结果就是&#xff1a;问题…

python 爬虫 入门 四、线程,进程,协程

线程和进程大部分人估计都知道&#xff0c;但协程就不一定了。 一、进程 进程是操作系统分配资源和调度的基本单位&#xff0c;一个程序开始运行时&#xff0c;操作系统会给他分配一块独立的内存空间并分配一个PCB作为唯一标识。初始化内存空间后进程进入就绪态&#xff0c;PC…

GUI编程

GUI编程 【Java从0到架构师课程】笔记 GUI简介 GUI&#xff1a;图形用户界面&#xff0c;在计算机中采用图形的方式显示用户界面 java的GUI开发 AWT&#xff1a;java最早推出的GUI编程开发包&#xff0c;界面风格跟随操作系统SWT&#xff1a;eclipse就是java使用SWT开发的Sw…

【ArcGIS微课1000例】0125:ArcGIS矢量化无法自动完成面解决方案

文章目录 一、坐标系统问题二、正确使用自动完成面工具一、坐标系统问题 1. 数据库坐标系 arcgis矢量化的过程中,无法自动完成面,可能是因为图层要素没有坐标系造成的。双击数据库打开数据库属性,可以查看当前数据框的坐标系。 2. 图层坐标系 双击图层,打开图层属性,切…

从零开始学PHP之变量作用域数据类型

一、数据类型 上篇文章提到了数据类型&#xff0c;在PHP中支持以下几种类型 String &#xff08;字符串&#xff09;Integer&#xff08;整型&#xff09;Float &#xff08;浮点型&#xff09;Boolean&#xff08;布尔型&#xff09;Array&#xff08;数组&#xff09;Objec…

滤波算法与SLAM:从概率角度理解SLAM问题

滤波算法与SLAM 第三章&#xff1a;MAP/MLE问题和贝叶斯网络 文章目录 滤波算法与SLAM前言一、最大后验问题&#xff08;MAP&#xff09;与最大似然问题&#xff08;MLE&#xff09;二、贝叶斯网络与SLAM问题三、因子图与SLAM问题四、从概率角度理解Kalman Filter与SLAM 前言 …

我谈傅里叶变换幅值谱的显示

在图像处理和分析中通常需要可视化图像傅里叶变换的幅值谱。通过幅值谱&#xff0c;可以直观地观察频率成分的分布&#xff0c;帮助理解图像的结构和特征。 很多刊物中直接显示傅里叶变换的幅值谱。 FFT fftshift(fft2(double(Img))); FFT_mag mat2gray(log(1abs(FFT)));由…

【Linux】线程基本概念,线程控制

目录 基本概念 重新理解进程 线程真实存在吗&#xff1f; 问题解答 线程资源 线程控制 线程创建 如何全面看待线程函数传参 如何看到线程函数返回 线程查询 线程等待 线程终止 线程分离 基本概念 线程&#xff08;thread&#xff09;是指在单个进程内&#xff0c;多…

探索前端与 AI 的结合:如何用 GPT-4 助力开发效率

前言&#xff1a;开发者的“神队友” GPT-4 还记得那些深夜奋战&#xff0c;紧盯着屏幕敲代码的日子吗&#xff1f;表单不验证、布局乱飞、BUG 根本找不到&#xff0c;这些时刻简直能让人抓狂。你可能会想&#xff1a;“要是有个智能助手能帮我搞定这些多好&#xff01;” 那么…

#HarmonyOS:页面和自定义组件生命周期

页面生命周期 即被Entry装饰的组件生命周期 onPageShow&#xff1a;页面每次显示时触发一次&#xff0c;包括路由过程、应用进入前台等场景。onPageHide: 页面每次隐藏时触发一次&#xff0c;包括路由过程、应用进入后台等场景。onBackPress: 当用户点击返回按钮是触发 组件…

全面了解 NGINX 的负载均衡算法

NGINX 提供多种负载均衡方法&#xff0c;以应对不同的流量分发需求。常用的算法包括&#xff1a;最少连接、最短时间、通用哈希、随机算法和 IP 哈希。这些负载均衡算法都通过独立指令来定义&#xff0c;每种算法都有其独特的应用场景。 以下负载均衡方法&#xff08;IP 哈希除…

如何让自己的网站,被更多的人搜索到(免费方案)

文章目录 一、要做时间的朋友二、需要独立IP的服务器三、SEO信息如何设置设置网站TDK生成网站地图设置搜索引擎自动提交部署SSL证书加分项&#xff1a;定期更新文章 引言&#xff1a; 许多人都有这样一个问题&#xff1a;做好自己的网站&#xff0c;如何让这个网站被更多的人浏…

WPF实现类似网易云音乐的菜单切换

这里是借助三方UI框架实现了&#xff0c;感兴趣的小伙伴可以看一下。 深色模式&#xff1a;​ 浅色模式&#xff1a; ​这里主要使用了以下三个包&#xff1a; MahApps.Metro&#xff1a;UI库&#xff0c;提供菜单导航和其它控件​​​​​​​ 实现步骤&#xff1a;1、使用B…

SSRF-利用dict协议-攻击redis

1.靶场准备&#xff1a; CTFHub-技能树-Web-SSRF-Redis协议 蚁剑AntSword 2.简述&#xff1a; 2.1 SSRF 服务器端请求伪造&#xff0c;存在一个url参数&#xff0c;一般用于图片上传、网页重定向等&#xff0c;我们可以控制url参数&#xff0c;去访问内网服务器的敏感内容…

前端vue框架配置基础信息详解分析

前端vue2、vue3框架是我们最近常用的框架&#xff0c;今天我们分析一下配置基础信息、详解其中的功能含义。 1、vue.config.js 文件分析 这个 vue.config.js 文件是 Vue CLI 项目中用于配置项目构建行为和开发环境设置的文件。它能够让开发者定制打包、代理、路径、样式等方面…

干货:落地企业级RAG的实践指南

1. 什么是RAG&#xff1f; 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称 RAG&#xff09;通过结合大型语言模型&#xff08;LLM&#xff09;和信息检索系统来提高生成文本的准确性和相关性.这种方法允许模型在生成回答之前&#xff0c;先从权威知…

spdlog学习记录

spdlog Loggers&#xff1a;是 Spdlog 最基本的组件&#xff0c;负责记录日志消息。在 Spdlog 中&#xff0c;一个 Logger 对象代表着一个日志记录器&#xff0c;应用程序可以使用 Logger 对象记录不同级别的日志消息Sinks&#xff1a;决定了日志消息的输出位置。在 Spdlog 中&…

深入拆解TomcatJetty(三)

深入拆解Tomcat&Jetty&#xff08;三&#xff09; 专栏地址&#xff1a;https://time.geekbang.org/column/intro/100027701 1 Tomcat组件生命周期 Tomcat如何如何实现一键式启停 Tomcat 架构图和请求处理流程如图所示&#xff1a; 对组件之间的关系进行分析&#xff0c;…

MySQL(python开发)——(3)表数据的基本操作,增删改查

MySQL&#xff08;python开发)——&#xff08;1&#xff09;数据库概述及其MySQL介绍 MySQL&#xff08;python开发)——&#xff08;2&#xff09;数据库基本操作及数据类型 MySQL—— 表数据基本操作 一、表中插入(insert)数据——增 insert into 表名 values (值1&#…