《Spring实战》(第6版)第1章 Spring起步
第1部分 Spring基础
第1章 Spring起步
1.1 什么是Spring
Spring的核心是提供一个容器(container)。
称为Spring应用上下文(Spring application context)。
创建和管理应用的组件(bean),与上下文装配在一起。
Bean装配通过依赖注入(Dependency Injection,DI)。
通过构造器参数和属性访问方法来实现。
<bean id = "inventoryService" class="com.example.InventoryService" />
<bean id = "productService" class="com.example.ProductService"><constructor-arg ref="inventoryService" />
</bean>
Java的配置更为常见,XML与Java是等价的。
@Configuration
public class ServiceConfiguration {@Beanpublic InventoryService inventoryService() {return new InventoryService();}@Beanpublic ProductService productService(){return new ProductService(inventoryService());}
}
@Configuration注解告知Spring这是一个配置类,会为Spring上下文提供Bean。
@Bean表明方法返回对象以Bean的形式添加到Spring上下文中,Bean的ID就是方法名。
以上都是显式配置,Spring不能自动配置时才有必要性。
自动配置起源于自动装配(autowiring)和组件扫描(component scanning)。
组件扫描技术使得Spring能自动发现应用类路径下的组件,并创建成Bean。
自动装配技术使Spring能够自动为组件注入他们依赖的其他Bean。
强如SpringBoot才是王道。
1.2 初始化Spring应用
创建名为Taco Cloud的在线应用,墨西哥煎玉米卷。
Spring Initializr浏览器的Web应用,也是Rest API,生成Spring结构骨架。
使用的几种方式:
- 通过https://start.spring.io/的Web应用
- 命令行中使用curl命令
- 命令行中使用SpringBoot命令行接口
- Spring Tool Suite中创建新项目(我喜欢Eclipse)
- IntelliJ IDEA中创建新项目
- NetBeans中创建新项目
- Apache NetBeans创建新项目
1.2.1 使用Spring Tool Suite初始化Spring项目
Eclipse先安装插件,Spring Tools。
File —> New —> Spring Starter Project。
我这里用的是Java17。

1.2.2 检查Spring项目的结构

项目结构,需注意一下几点:
- mvnw,mvnw.cmd:这是Maven包装器(wrapper)脚本,即使机器上没装maven,也能构建项目。
- pom.xml:Maven构建规范,维护了所有的包。
- TacoCloudApplication.java:SpringBoot主类,会启动该项目。
- static:存放任意浏览器提供服务的静态内容(图片、样式表、JS脚本等)。
- templates:渲染内容到浏览器的模板文件。
- TacoCloudApplicationTests.java:是简单测试类,确保Spring应用上下文加载成功。
POM文件,具体含义自己查吧。
也就是 Spring版本,依赖,插件,测试,关注一下。
引导类
package tacos;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class TacoCloudApplication {public static void main(String[] args) {SpringApplication.run(TacoCloudApplication.class, args);}}
注解表示是一个SpringBoot应用,main方法里运行应用。
SpringBootApplication是一个组合注解包括其他三个注解。
- @SpringBootConfiguration:声明为配置类,后续可以添加基于Java的配置,是Configuration特殊形式。
- @EnableAutoConfiguration:启用SpringBoot自动配置,此注解告诉SpringBoot自动配置认为我们会用到的组件。
- @ComponentScan:启用组件扫描,通过像@Component,@Controller,@Service的注解声明其他类,容器自动注册为应用上下文的组件。
测试应用
命令行手动测试:
./mvnw package
...
java -jar target/taco-cloud-0.0.1-SNAPSHOT.jar
用Maven插件构建更简单
./mvnw spring-boot:run

用Maven指令运行测试类:./mvnw test
1.3 编写Spring应用
给项目添加一个主页,创建两个代码构件:
- 控制器类,处理主页相关请求。
- 视图模板,定义主页的样子。
1.3.1 处理Web请求
Spring自带的强大Web框架,SpringMVC。
SpringMVC核心是控制器(controller)的理念。
控制器是处理请求并以某种方式进行消息的响应的类。
面向浏览器应用中,控制器填充可选的数据模型并请求传递一个视图,便于生成HTML返回给浏览器。
编写以根路径(“/”)为请求的简单的控制器并处理请求,将请求转发至主页视图。
主页控制器
package tacos;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller//控制器
public class HomeController {@GetMapping("/")//处理对根路径"/"的请求public String home() {return "home";//返回视图名}}
Controller注解主要目的是让组件扫描将这个类识别为一个组件。
HomeController带有此注解,Spring组件扫描功能会自动发现它并创建bean。
实际上,Component,Service,Repository都有类似目的,作用都相同,只不过意思更能描述组件在应用中的角色。
home()是一个简单的控制器方法。GetMapping表明对/发送HTTP GET请求,由此方法来处理。
返回的String类型的home值会解析为视图的逻辑名,也就是Thymeleaf类路径中的模板名字。
注意:Thymeleaf,FreeMarker,JSP都是模板,为啥不用其他,官方建议的,也是好用的。
模板名称是逻辑视图名派生而来(也就是你返回哪个字符串,模板文件就叫这个名字),在加上"templates"前缀和".html"后缀。最终形成的模板路径将是"/templates/home.html"。
因此,我们需要将模板放到项目"/src/main/resources/templates/home.html"中。
1.3.2 定义视图
主页简单点,欢迎用户,不做其他事情。
TacoCloud主页模板
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Taco Cloud</title>
</head>
<body><h1>Welcome to...</h1><img th:src = "@{/images/TacoCloud.png}" />
</body>
</html>
先百度一张墨西哥玉米卷图片,处理后粘贴到images,没有在static下面建,本人用的是HTML5页面。
也就是说图片路径为:/taco-cloud/src/main/resources/static/images/TacoCloud.png
1.3.3 测试控制器
测试根目录"/“,发送HTTP GET请求期望得到成功结果,视图名home,结果内容包含"Welcome to …”。
针对主页控制器的测试
package tacos;import static org.hamcrest.CoreMatchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;@WebMvcTest(HomeController.class)//针对HomeController的Web测试
public class HomeControllerTest {@Autowiredprivate MockMvc mockMvc;//注入MockMVC@Testpublic void testHomePage() throws Exception {mockMvc.perform(get("/")) //发起对"/"的GET请求.andExpect(status().isOk()) //期望得到HTTP 200.andExpect(view().name("home")) //期望得到home视图.andExpect(content().string(containsString("Welcome to..."))); //期望包含的内容}
}
可以在IDE中运行,也可以用Maven命令:mvnw test
结果绿色。
1.3.4 构件和运行应用
调出boot仪表盘,Window —> Show View —> Boot Dashboard

启动后并运行。http://localhost:8080/

1.3.5 了解Spring Boot DevTools
DelTools为Spring开发人员提供了便利的开发期工具和特性。
- 代码变后应用自动重启。
- 浏览器资源变化后自动刷新浏览器。
- 自动禁用模板缓存。
- 如果使用H2数据库,内置了H2控制台。
需注意,DevTools不是IDE插件,不用使用特定IDEA都能很好运行。
用途是开发,生成环境自动禁用自己。
自动重新启动
启用DevTools时,程序加载JVM中的两个独立类加载器。
一类加载器加载Java代码,属性文件以及src/main/下所有经常变动的内容。
另一个类加载器加载依赖的库,不经常变化。
不足之处依赖库不会自动重新加载,要生效,重启应用。
浏览器资源变化后自动刷新浏览器
默认情况,Thymeleaf和FreeMarker模版方案配置时缓存模版解析结果。
生产环境,性能好,不用重新解析。
开发期要时时看到变化,则不要缓存模版。
自动启动LiveReload服务器,自动刷新浏览器,浏览器端可以安装插件。
内置的H2控制台
当前项目还未使用数据库,如使用H2数据库,DevTools自动启动H2控制台。
http://localhost:8080/h2-console
配置H2数据库
# 启用H2控制台(访问地址:http://localhost:8080/h2-console)
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console# 配置内存数据库(数据仅存在于应用运行期间,重启后丢失)
spring.datasource.url=jdbc:h2:mem:tacocloud
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
《H2数据库》
1.4 俯瞰Spring风景线
要了解Spring的整体状况,只需查看完整版本的Spring Initializr Web表单列表。
鼓励去看一下,100多依赖项。
1.4.1 Spring核心框架
Spring核心框架是基础,核心容器和依赖注入框架,SpringMVC,基于模板的JDBC支持,WebFlux反应式Web框架。
1.4.2 Spring Boot
优势,starter依赖和自动配置。
其他特性:
- Actuator洞察应用运行时的内部工作状况,包括指标,线程dump信息,应用的健康状况以及应用程序可用的环境属性。
- 灵活环境属性规范。
- 测试辅助功能外,对测试的额外支持。
SpringBoot提供了基于Groovy脚本的编程模型,Spring Boot CLI。
1.4.3 Spring Data
核心框架提供基本数据持久化支持外,Spring Data提供了令人惊叹的功能:将应用程序的数据存储库(repository)定义为简单的Java接口,定义存储和检索数据的方法使用一种特定的命名约定即可。
还可以处理多种不同类型数据库,关系型数据库(JDBC或JPA),文档数据库(Mongo),图数据库(Neo4j)等。
1.4.4 Spring Security
Spring Security解决了应用程序通用的安全性需求,包括身份验证,授权,API安全性。
1.4.5 Spring Integration和Spring Batch
Spring Integration解决了实时集成问题。
Spring Batch解决了批处理集成问题。
1.4.6 Spring Cloud
Spring Cloud是使用Spring开发云原生应用程序的一组项目。
推荐一本书:Thomas Vitale的Cloud Native Spring in Action(Manning,2020年)。
1.4.7 Spring Native
使用GraalVM原生镜像编译器将SpringBoot项目编译成原生可执行文件,从而使镜像启动速度显著加快,并且占用更小的空间。
更多信息搜GitHub关于spring-native代码库。
相关文章:
《Spring实战》(第6版)第1章 Spring起步
第1部分 Spring基础 第1章 Spring起步 1.1 什么是Spring Spring的核心是提供一个容器(container)。 称为Spring应用上下文(Spring application context)。 创建和管理应用的组件(bean),与上下文装配在一起。 Bean装配通过依赖注入(Dependency Injection,DI)。…...
PAT乙级真题 — 1084 外观数列(java)
外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, ...它从不等于 1 的数字 d 开始,序列的第 n1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d,所以就是 d1;第 2 项是 1 个 d(对…...
I.MX6ull 看门狗
一、看门狗介绍 WatchDog是为了能够防止程序跑飞而使用的一种硬件模块。如果你的程序没有跑飞,那么你的程序会 定时的去喂看门狗;如果你的程序跑飞了,那么就不会再去喂狗了,如果超过了喂狗的时间,那么狗就会 自己生成一个信号来重…...
鲸鱼算法优化Transformer+KAN网络并应用于时序预测任务
😊😊😊欢迎来到本博客😊😊😊 本次博客内容将聚焦于深度学习的相关知识与实践 🎉作者简介:⭐️⭐️⭐️主要研究方向涵盖深度学习、计算机视觉等方向。 📝目前更新&#x…...
一维差分算法篇:高效处理区间加减
那么在正式介绍我们的一维差分的原理前,我们先来看一下一维差分所应用的一个场景,那么假设我们现在有一个区间为[L,R]的一个数组,那么我要在这个数组中的某个子区间比如[i,m] (L<i<m<R)进行一个加k值或者减去k值的一个操作ÿ…...
export关键字
注意点: 使用 export 和 import 时,确保你的JavaScript环境支持ES6模块 在JavaScript中,export 关键字主要用于模块化编程,允许你将代码的不同部分导出,使得其他模块可以通过 import 关键字来引入这些部分。这是ES6&a…...
【C++】基础入门(详解)
🌟 Hello,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 目录 输入&输出 缺省参数(默认参数) 函数重载 引用 概念及定义 特性及使用 const引用 与指针的关系 内联inline和nullptr in…...
【快速入门】Unity 常用组件(功能块)
欢迎关注 、订阅专栏 【unity 新手教程】谢谢你的支持!💜💜 文章目录 Unity 常用组件(功能块):Transform - 变换:坐标、朝向、大小Mesh Filter - 加载网格数据Mesh Renderer- 渲染网格Camera - …...
Nessus 工具使用全攻略
目录 一、Nessus:网络安全的坚固防线 二、Nessus 安装指南 (一)获取安装包 (二)安装流程 三、初次配置:开启 Nessus 的第一步 (一)账号注册 (二)激活 …...
1441. 用栈操作构建数组 中等
1441. 用栈操作构建数组 给你一个数组 target 和一个整数 n。每次迭代,需要从 list { 1 , 2 , 3 ..., n } 中依次读取一个数字。 请使用下述操作来构建目标数组 target : "Push":从 list 中读取一个新元素, 并将其推入…...
【Springboot知识】从零开始配置springfox
文章目录 配置过程1. 添加依赖2. 创建Swagger配置类3. 配置Swagger UI4. 自定义Swagger配置(可选)4.1 添加全局请求参数4.2 配置响应消息 5. 运行项目并访问Swagger UI6. 其他注意事项7. 使用Springfox 3.x(可选)总结 忽略登录验证…...
PHP代驾系统小程序
🚗 代驾系统 —— 安全、便捷、智能的出行新选择 🔧 一款基于先进ThinkPHPUniapp技术架构,匠心独运的代驾软件横空出世,微信小程序端率先登场,为您的出行之旅增添前所未有的便捷与安全。它不仅是您贴心的出行助手&…...
pg认证需要培训机构吗
认证类型决定是否需要培训机构 官方认证 PostgreSQL社区认证:PostgreSQL社区并未强制要求通过培训机构才能参加认证考试。例如,PostgreSQL Professional Certification(由社区认可的机构提供)通常允许考生自学后直接报名考试。 Po…...
网络安全扫描--基础篇
前言 1、了解互联网安全领域中日趋重要的扫描技术 2、了解在不同网络场景下扫描技术手段 3、熟悉linux下系统内核防护策略并能大件一个有效的系统防护体系 4、增强工作安全意识,并能有效的实践于工作场景中 目录 1、熟悉主机扫描工具(fping,…...
【MySQL数据库】Ubuntu下的mysql
目录 1,安装mysql数据库 2,mysql默认安装路径 3,my.cnf配置文件? 4,mysql运用的相关指令及说明 5,数据库、表的备份和恢复 mysql是一套给我们提供数据存取的,更加有利于管理数据的服务的网络程序。下…...
GPQA (Graduate-Level Google-Proof QA Benchmark) 数据集
标题:挑战人类与AI的极限:GPQA——一个面向未来的高难度科学问答基准 引言 在人工智能快速发展的今天,大型语言模型(如GPT-4)已能在许多任务中媲美甚至超越人类表现。然而,当面对需要高度专业知识的问题时&…...
WebRTC与EasyRTC:开启智能硬件音视频通讯的全新旅程
在当今数字化时代,音视频通讯技术正以前所未有的速度革新着我们的生活与工作方式。WebRTC与EasyRTC作为这一领域的佼佼者,正携手为智能硬件的音视频通讯注入强大动力,开启全新的篇章。 一、WebRTC与智能硬件融合的崭新趋势 WebRTC技术&…...
利用ffplay播放udp组播视频流
ffplay -fs -fflags nobuffer -flags low_delay -analyzeduration 0 -probesize 32 -framedrop -sync ext -strict experimental udp://224.1.1.1:5001 -fs : 全屏显示 -fflags nobuffer : 禁用输入缓冲(减少100-200ms缓冲延迟) -an…...
基于Ceedling的嵌入式软件单元测试
Ceedling 如果你使用 Ceedling(一个针对 C 代码单元测试的构建管理器),可以更方便地管理测试。Ceedling 会自动处理 Unity 和 CMock 的集成,无需手动编写 Makefile。 1.环境搭建 1.1 Ruby环境 sudo apt-get install ruby1.2 安…...
一文深入了解DeepSeek-R1:模型架构
本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型,以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 📝 1. 输入上下文长度 DeepSeek-R1的输入上下文长…...
机试题——快乐时间
题目描述 小明在工作之余喜欢在电子书城阅读不同的书籍并且获得最大的满足感,因此根据书城针对每本书籍的评分收集了 n 个书籍的打分清单 books,例如第一本书的打分 books[0]5 代表该书的满意程度为 5,第二本书 books[1]-2 代表该书的满意程…...
2024年终总结和2025年规划
2024年的主线是AI基础的学习和读书,虽然AI学习花费了更多的时间,但是读书长久看来于我是更重要的事情,哈哈哈,因此先简单回顾一下读书记忆,回顾我的2024,再展望一下我的2025. 我的2024年记忆 读万卷书&am…...
5 .TCP传输 文件/数据
文件传输 本质:客户端通过标准IO或者文件IO,读取文件中的信息 然后将读取到的信息,通过套接字发送给服务器 服务器接收到后,立刻通过标准IO或者文件IO写到文件 这个过程,服务器要知道2件事 1:客户端发来的文件名字 …...
哈希表(典型算法思想)—— OJ例题算法解析思路
目录 一、1. 两数之和 - 力扣(LeetCode) 算法代码: 1. 问题描述 2. 核心思路 3. 代码实现思路 (1)初始化哈希表 (2)遍历数组 (3)返回结果 4. 时间复杂度分析 …...
CloudberryDB(七)二级索引
在CloudberryDB中,二级索引的概念与PostgreSQL中的类似。但是,由于分布式特性,创建和使用二级索引需要考虑一些额外的因素。以下是关于二级索引的一些要点: 1. **创建索引**:在Greenplum中,可以使用CREATE…...
学习web数据埋点
什么是埋点,以及为什么需要埋点 通过代码主动收集用户行为数据(如点击、浏览、停留时长等),用于数据分析驱动产品优化。 一、前端埋点 在客户端(浏览器、移动端应用)直接采集用户行为数据,通…...
Next.js【详解】CSS 样式方案
全局样式 Global CSS 默认已创建,即 src\app\globals.css,可根据需要修改 默认在全局布局中导入 src\app\layout.tsx import "./globals.css";组件样式 CSS Modules 新建文件 src\app\test\styles.module.css .red {color: red;}导入目标页面…...
HCIA项目实践--RIP相关原理知识面试问题总结回答
9.4 RIP 9.4.1 补充概念 什么是邻居? 邻居指的是在网络拓扑结构中与某一节点(如路由器)直接相连的其他节点。它们之间可以直接进行通信和数据交互,能互相交换路由信息等,以实现网络中的数据转发和路径选择等功能。&am…...
无人机信号调制技术原理
一、调制技术的必要性 频谱搬移:将低频的基带信号搬移到高频的载波上,便于天线辐射和传播。 信道复用: 利用不同的载波频率或调制方式,实现多路信号同时传输,提高信道利用率。 抗干扰: 通过选择合适的调…...
Qt——连接MySQL数据库之编译数据库驱动的方法详细总结(各版本大同小异,看这一篇就够了)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…...
