Spring boot从0到1 - day01
前言
Spring 框架作为 Java 领域中最受欢迎的开发框架之一,提供了强大的支持来帮助开发者构建高性能、可维护的 Web 应用。
学习目标
Spring 基础
- Spring框架是什么?
- Spring IoC与Aop怎么理解?
Spring Boot 的快速构建
Spring 基础
学习Spring Boot 之前了解Spring。
为什么要了解Spring?
Spring Boot 是基于 Spring 框架之上构建的,它利用了 Spring 框架的许多核心功能,如依赖注入(Dependency Injection, DI)、面向切面编程(Aspect-Oriented Programming, AOP)等。
当你在使用 Spring Boot 开发应用程序时,可能会遇到各种问题。了解 Spring 框架的基本原理可以帮助你更快地定位和解决问题。例如,如果你了解 Spring 的依赖注入机制,就可以更容易地排查 Bean 的创建和销毁过程中的问题。
Spring框架是什么?
Spring 框架是一个轻量级的开源 Java 框架,用于构建企业级应用程序。它最初由 Rod Johnson 创建,并首次出现在他的书《Expert One-On-One J2EE Development and Design》中。Spring 的设计目的是简化 Java 应用程序的开发,尤其是企业级应用的复杂性。
Spring 框架的特点
-
轻量级:
- Spring 被称为轻量级框架,因为它不强制使用特定的类库或 API,也不要求特定的部署环境。这意味着 Spring 应用程序可以独立运行,也可以作为 Web 应用程序的一部分运行。
-
控制反转(IoC):
- Spring 提供了 IoC 容器,用于管理对象之间的依赖关系。开发者可以将对象创建和依赖关系的管理交给 Spring 容器,从而实现解耦。
-
面向切面编程(AOP):
- Spring 支持 AOP,允许开发者以非侵入性的方式增强服务。AOP 可以帮助解决 Java 企业级编程中的常见问题,如事务管理、日志记录等。
-
声明式事务管理:
- Spring 提供了声明式事务管理的支持,使得开发者可以从复杂的事务管理代码中解放出来,从而提高开发效率。
-
模块化:
- Spring 框架由多个模块组成,每个模块都可以独立存在或与其他模块结合使用。这提供了灵活性,让开发者可以选择需要的功能。
-
开源:
- Spring 是一个开源框架,意味着它可以免费使用,并且源代码可供查看和修改。
为什么 Spring 是轻量级的?
虽然 Spring 提供了大量的功能,但它仍然被认为是轻量级的,原因如下:
- 非侵入性: Spring 的设计尽量减少对外部框架的依赖,允许开发者仅使用所需的部分。
- 易于集成:Spring 可以很容易地与现有的系统集成,而不需要重大的架构更改。
- 可配置性:开发者可以通过 XML 或注解来配置 Spring,这样可以根据需要调整应用程序的行为。
Spring IoC与Aop怎么理解?
Spring IoC(Inversion of Control,控制反转)和 AOP(Aspect-Oriented Programming,面向切面编程)是 Spring 框架中的两个核心概念,它们分别解决了对象管理和跨切关注点的代码重用问题。下面我们分别解释这两个概念及其在 Spring 中的应用。
Spring IoC (Inversion of Control, 控制反转)
让我们用喝水的例子来更好地说明 IoC 的概念:
想象一下,在传统的编程模式中,如果你想喝一杯热水,你需要自己去找电水壶,然后加水,再插电加热,最后才能喝到热水。这个过程中,你主动控制了所有步骤,即你自己管理了“依赖”。
而在 IoC 的情景下,就像是你有一个智能家庭系统,当你告诉它你想喝热水时,它会为你准备好一切——找到电水壶、加水、加热,最后把准备好的热水送到你面前。在这个过程中,你不需要关心热水是如何准备的,你只需要关心最终的结果——热水。
控制反转是一种设计模式,其主要目的是减少对象之间的依赖关系。在 Spring 框架中,IoC 是通过依赖注入(Dependency Injection, DI)来实现的。
IoC 示例
首先,我们定义一个 WaterHeaterService
类,它依赖于 WaterHeaterRepository
:
public class WaterHeaterService {private WaterHeaterRepository waterHeaterRepository;public WaterHeaterService(WaterHeaterRepository waterHeaterRepository) {this.waterHeaterRepository = waterHeaterRepository;}public HotWater getHotWater() {return waterHeaterRepository.prepareHotWater();}
}
接着,我们定义 WaterHeaterRepository
接口及其实现:
public interface WaterHeaterRepository {HotWater prepareHotWater();
}public class WaterHeaterRepositoryImpl implements WaterHeaterRepository {@Overridepublic HotWater prepareHotWater() {// 假设这里是一个复杂的加热逻辑return new HotWater();}
}public class HotWater {// HotWater 类的具体实现
}
在 Spring 框架中,我们将使用注解来定义和注入依赖:
@Service
public class WaterHeaterServiceImpl implements WaterHeaterService {private final WaterHeaterRepository waterHeaterRepository;@Autowiredpublic WaterHeaterServiceImpl(WaterHeaterRepository waterHeaterRepository) {this.waterHeaterRepository = waterHeaterRepository;}public HotWater getHotWater() {return waterHeaterRepository.prepareHotWater();}
}@Repository
public class WaterHeaterRepositoryImpl implements WaterHeaterRepository {@Overridepublic HotWater prepareHotWater() {// 假设这里是一个复杂的加热逻辑return new HotWater();}
}public class HotWater {// HotWater 类的具体实现
}
Spring AOP (Aspect-Oriented Programming, 面向切面编程)
面向切面编程是一种编程范式,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中分离出来。横切关注点是指那些跨越多个类的功能,如日志记录、事务管理、权限验证等。
AOP 示例
接下来,我们可以定义一个切面来记录加热前后的时间:
@Aspect
@Component
public class HeatingLogAspect {@Before("execution(* com.example.service.WaterHeaterServiceImpl.getHotWater())")public void logBefore(JoinPoint joinPoint) {System.out.println("Starting heating process: " + joinPoint.getSignature());}@After("execution(* com.example.service.WaterHeaterServiceImpl.getHotWater())")public void logAfter(JoinPoint joinPoint) {System.out.println("Heating process finished: " + joinPoint.getSignature());}
}
在这个例子中,HeatingLogAspect
类定义了两个通知,分别在加热过程开始和结束时记录日志。
Spring Boot 的快速构建
1.打开网址:https://start.spring.io/
如果您想要配置 Spring Boot 3.3 项目来使用正确的 JDK 版本,您需要:
确认 JDK 版本:确保您的开发环境中安装了 Java 17 或更高版本的 JDK。
IDEA 配置:如果您使用的是 IntelliJ IDEA,需要在项目设置中指定正确的 JDK 版本。
2.
3.点击生成,导入idea
点击file -> Open->找到demo,导入。等待下载好依赖
个人建议还是用jdk1.8,等网上出了教程在看jdk17,springboot 3需要注意点有不少。
总结
- IoC 通过依赖注入简化了对象间的依赖关系,使得
WaterHeaterService
不需要关心WaterHeaterRepository
的创建和配置细节。 - AOP 通过切面编程将加热过程的日志记录逻辑从业务逻辑中分离出来,提高了代码的可读性和可维护性。
打卡学习Spring boot 第一天。
AOP不是OOP的替代品,而是OOP的补充
相关文章:

Spring boot从0到1 - day01
前言 Spring 框架作为 Java 领域中最受欢迎的开发框架之一,提供了强大的支持来帮助开发者构建高性能、可维护的 Web 应用。 学习目标 Spring 基础 Spring框架是什么?Spring IoC与Aop怎么理解? Spring Boot 的快速构建 Spring 基础 学习…...

Flutter 项目结构的区别
如果需要调用原生代码,请创建一个plugin类型的项目开发。如果需要调用C语言,请参考文档:Flutter项目中调用C语言plugin 其实是 package 的一种,全称是 plugin package,我们简称为 plugin,中文叫插件。 1. A…...
EfficientFormerV2:重新思考视觉变换器以实现与MobileNet相当的尺寸和速度。
摘要 https://arxiv.org/pdf/2212.08059 随着视觉变换器(ViTs)在计算机视觉任务中的成功,近期的研究尝试优化ViTs的性能和复杂度,以实现在移动设备上的高效部署。提出了多种方法来加速注意力机制,改进低效设计…...

ASP.NET Core高效管理字符串集合
我们在开发 Web 项目时经常遇到需要管理各种来源的字符串集合(例如HTTP 标头、查询字符串、设置的值等)的情况。合理的管理这些字符串集合不仅可以减少出bug的几率,也能提高应用程序的性能。ASP.NET Core 为我们提供了一种特殊的只读结构体 S…...
vm-tools的卸载重装,只能复制粘贴,无法拖拽文件!
开始 ubuntu22.04 LTSVMwareTools-10.3.25-20206839.tar.gzVMware Workstation 17 Pro 各种该尝试的配置都尝试了,比如: 1.开启复制粘贴拖拽; 2.VMware Tools拖拽失效; 3.解决VMware无法拖拽. 均没有奏效. 安装过程报错, 报错异常: The installation of VMware Tools 10.3.25…...
Docker 容器网络技术
Docker 容器网络技术 一、概述 Docker 容器技术在微服务架构和云原生应用中扮演着重要角色。容器的轻量化和快速启动特性,使得它们成为现代应用部署的首选。然而,容器的网络连接和管理是一个复杂的问题,尤其是当涉及到容器间通信时。Docker…...
C++ 起始帧数、结束帧数、剪辑视频
C 指定起始帧数、结束帧数、 剪辑视频 C 无法直接用H264,只能用avi编码格式 #include <iostream> #include <opencv2/opencv.hpp>int main() {// 读取视频:创建了一个VideoCapture对象,参数为摄像头编号std::string path &quo…...
【项目一】基于pytest的自动化测试框架———解读requests模块
解读python的requests模块 什么是requests模块基础用法GET与POST的区别数据传递格式会话管理与持久性连接处理相应结果应对HTTPS证书验证错误处理与异常捕获 这篇blog主要聚焦如何使用 Python 中的 requests 模块来实现接口自动化测试。下面我介绍一下 requests 的常用方法、数…...
升级Ubuntu内核的几种方法
注意: Ubuntu主线内核由 Ubuntu 内核团队提供,用于测试和调试目的。 它们不受支持且不适合生产使用。 仅当它们可以解决当前内核遇到的关键问题时,才应该安装它们。 1、手动下载deb文件升级内核 来源:kernel.ubuntu.com/main…...

Android绘制靶面,初步点击位置区域划分取值测试
自定义View: public class TargetView extends View {private Paint paint;private int[] radii {100, 250, 400, 550, 700}; // 五个圆的半径private int numberOfSegments 8;private int[][] regionValues; // 存储每个区域的值public TargetView(Context cont…...
【SpringBoot】调度和执行定时任务--Quartz(超详细)
Quartz 是一个功能强大的任务调度框架,广泛用于在 Java 应用程序中定时执行任务,同时它支持 Cron 表达式、持久化任务、集群等特性。以下是 Quartz 的详细使用教程,包括安装、基本概念、简单示例和高级功能。 1. 安装 Quartz 首先ÿ…...

低代码开发平台系统架构概述
概述 织信低代码开发平台(产品全称:织信Informat)是一款集成了应用设计、运行与管理的综合性平台。它提供了丰富的功能模块,帮助用户快速构建、部署和维护应用程序。织信低代码平台通过集成丰富的功能模块,为用户提供…...
源码编译llama.cpp 、ggml 后端启用自定义BLAS加速
源码编译llama.cpp 、ggml 后端启用自定义BLAS加速 我在llama.cpp 官网上提交了我的解决方案:How to setup OpenBlas on windows? #625 GGML 官网 https://github.com/ggerganov/ggml/issues/959 windows on arm 编译 llama.cpp 、ggml 后端启用自定义BLAS加速 …...

glb数据格式
glb数据格式 glb 文件格式只包含一个glb 文件,文件按照二进制存储,占空间小 浏览 浏览glb工具的很多,ccs,3D查看器等都可以,不安装软件的话用下面网页加载就可以,免费 glTF Viewer (donmccurdy.com) glb…...

手语识别系统源码分享
手语识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …...
Oracle 数据库部署与实施
文章目录 1. macOS 上部署 Oracle 数据库通过 Docker 在 macOS 上部署 2. Linux 上部署 Oracle 数据库直接在 Linux 上部署通过 Docker 在 Linux 上部署 3. Windows 上部署 Oracle 数据库4. 使用 Docker 部署 Oracle 数据库前提条件拉取 Oracle 数据库 Docker 镜像运行 Oracle …...
【Python】 ast.literal_eval 与 eval
一、背景 我在在编写管理后台的过程中,遇到一个小问题,是关于用户名的存储和解码。用户名以base64编码的形式存储在 MySQL 数据库中,并且还保留了b这样的形式,具体为什么要这样存我也不知道,可能是因为有些特殊字符无法直接存储。…...

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器
文章目录 垃圾回收机制垃圾收集器垃圾收集器分类ZGC 收集器ZGC 的性能优势复制算法指针染色读屏障 ZGC 的工作过程Stop-The-World 暂停阶段并发阶段 垃圾回收机制 垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空…...

基于 K8S kubernetes 的常见日志收集方案
目录 1、日志对我们来说到底重不重要? 2、常见的日志收集方案 2.1 EFK 2.2 ELK Stack 2.3 ELKfilebeat 2.4 其他方案 2、elasticsearch组件介绍 3、filebeat组件介绍 3.1 filebeat和beat关系 3.2 filebeat是什么? 3.3 Filebeat工作原理 3.4 …...

Unity3D 小案例 像素贪吃蛇 02 蛇的觅食
Unity3D 小案例 像素贪吃蛇 第二期 蛇的觅食 像素贪吃蛇 食物生成 在场景中创建一个 2D 正方形,调整颜色,添加 Tag 并修改为 Food。 然后拖拽到 Assets 文件夹中变成预制体。 创建食物管理器 FoodManager.cs,添加单例,可以设置…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...