当前位置: 首页 > news >正文

《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)&#xff0c;与上下文装配在一起。 Bean装配通过依赖注入(Dependency Injection,DI)。…...

E卷-特殊的加密算法-(200分)

专栏订阅🔗 特殊的加密算法 问题描述 有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下: 明文为一段由 0-9 组成的数字串。密码本为由数字 0-9 组成的二维数组。需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里…...

QT 异步编程之多线程

一、概述 1、在进行桌面应用程序开发的时候&#xff0c;假设应用程序在某些情况下需要处理比较复制的逻辑&#xff0c;如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个线程处理窗口事…...

K-均值(K-means)

K-均值&#xff08;K-means&#xff09;是一种常用的无监督学习算法&#xff0c;用于将数据集中的样本分成 K 个簇。该算法的过程大致如下&#xff1a; 1. 随机初始化 K 个聚类中心&#xff08;centroid&#xff09;。 2. 将每个样本分配到与其最近的聚类中心所代表的簇。 3. …...

AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐

AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐 目录 AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐比特币AI Agents稳定币扩容区块链AI基础设施AI驱动的软件应用AI赋能的行业应用AI医疗影像、智能客服、个性化推荐AI药物研发比特币 市场与机构化:2024…...

接入 SSL 认证配置:满足等保最佳实践

前言 随着信息安全形势的日益严峻&#xff0c;等保&#xff08;信息安全等级保护&#xff09;要求成为各行业信息系统必须遵守的标准。在数据库领域&#xff0c;OpenGauss作为一款高性能、安全、可靠的开源关系型数据库&#xff0c;也需要满足等保要求&#xff0c;确保数据的安…...

微软AutoGen高级功能——Selector Group Chat

介绍 大家好&#xff0c;这次给大家分享的内容是微软AutoGen框架的高级功能Selector Group Chat(选择器群聊)&#xff0c;"选择器群聊"我在给大家分享的这篇博文的代码中有所体现微软AutoGen介绍——Custom Agents创建自己的Agents-CSDN博客&#xff0c;但是并没有详…...

w206基于Spring Boot的农商对接系统的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…...

Springboot中使用Elasticsearch(部署+使用+讲解 最完整)

目录 引言 一、docker中安装Elasticsearch 1、创建es专有的网络 2、开放端口 3、在es-net网络上安装es和kibana 4、可能出现的问题 5、测试 6、安装IK分词器 7、测试IK分词器 二、结合业务实战 1、准备依赖 2、配置yml 3、读取yml配置 4、准备es配置类 5、编写测…...

深度求索—DeepSeek API的简单调用(Java)

DeepSeek简介 DeepSeek&#xff08;深度求索&#xff09;是由中国人工智能公司深度求索&#xff08;DeepSeek Inc.&#xff09;研发的大规模语言模型&#xff08;LLM&#xff09;&#xff0c;专注于提供高效、智能的自然语言处理能力&#xff0c;支持多种场景下的文本生成、对…...

flv实时监控视频

文章目录 前言一、安装二、引入三、使用 前言 开发大屏项目时&#xff0c;可能需要在大屏上展示一个监控画面&#xff0c;此时就可以用的flv.js来展示视频效果 一、安装 npm install flv.js二、引入 import flvjs from flv.js;三、使用 <video ref"videoElement&quo…...

有哪些免费的SEO软件优化工具

随着2025年互联网的不断发展&#xff0c;越来越多的企业意识到在数字营销中&#xff0c;网站的曝光度和排名至关重要。无论是想要提高品牌知名度&#xff0c;还是想要通过在线销售增加收益&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;都是一项不可忽视的关键策略。而要…...

跟着ai辅助学习vue3

第一章&#xff1a;基础入门&#xff08;1 - 2 周&#xff09; 1. 了解 Vue 3 概述 阅读官方文档简介 访问 Vue 3 官方文档&#xff0c;在首页或简介板块中&#xff0c;重点了解 Vue 3 相较于 Vue 2 的重大变革。比如&#xff0c;Vue 3 采用了 Proxy 实现响应式系统&#xff…...

什么是Mustache

Mustache 是一种轻量级模板引擎&#xff0c;用于将变量插入到模板中生成最终的文本输出。它的设计简单且易于使用&#xff0c;适用于多种编程语言&#xff0c;包括 JavaScript、Python、Ruby、Java 等。 Mustache 的模板语法使用双大括号 {{}} 包裹变量或表达式&#xff0c;用…...

C++,STL容器适配器,priority_queue:优先队列深入解析

文章目录 一、容器概览与核心特性核心特性速览二、底层实现原理1. 二叉堆结构2. 容器适配器架构三、核心操作详解1. 容器初始化2. 元素操作接口3. 自定义优先队列四、实战应用场景1. 任务调度系统2. 合并K个有序链表五、性能优化策略1. 底层容器选择2. 批量建堆优化六、注意事项…...

1.综述 Google 的软件工程读书笔记

Google 的软件工程由Google的多位资深工程师合著&#xff0c;分享了他们在管理Google庞大代码库&#xff08;超过20亿行代码&#xff09;过程中总结的经验教训。这本书不仅涵盖了软件工程的理论知识&#xff0c;还结合了Google的实际案例&#xff0c;展示了如何在大规模、复杂的…...

vue框架生命周期详细解析

Vue.js 的生命周期钩子函数是理解 Vue 组件行为的关键。每个 Vue 实例在创建、更新和销毁过程中都会经历一系列的生命周期阶段&#xff0c;每个阶段都有对应的钩子函数&#xff0c;开发者可以在这些钩子函数中执行特定的操作。 Vue 生命周期概述 Vue 的生命周期可以分为以下几…...

复杂电磁环境下无人机自主导航增强技术研究报告——地磁匹配与多源数据融合方法,附matlab代码

本文给出介绍和matlab程序&#xff0c;来实现地磁辅助惯性导航仿真验证&#xff0c;包含地磁基准图构建、飞行轨迹生成、INS误差建模、地磁匹配定位及多源数据融合等模块。通过对比分析验证地磁匹配修正惯性导航累积误差的有效性&#xff0c;可视化显示卫星拒止环境下的航迹修正…...

蓝桥杯---排序数组(leetcode第912题)

文章目录 1.题目重述2.思路分析3.代码解释 1.题目重述 题目的要求是不使用库函数或者是其他的内置的函数&#xff08;就是已经实现好的函数&#xff09;&#xff0c;也就是这个排序的逻辑需要我们自己进行实现&#xff1b; 2.思路分析 其实这个例子也是很容易理解的&#xff…...

考研高数复习规范

前言 这里记录我的高数复习规范与规划&#xff0c;希望能给需要考研的同学一点启发 规范原因 高数的内容很多&#xff0c;关键的是&#xff1a;会做题、拿高分首先最重要的就是抓住概念。比如有界无界的概念&#xff0c;间断点的概念、极限的概念其次是做题过程中得到的方法…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...