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

Spring - 简单实现一个 Spring 应用

一、为什么需要学习Spring框架?

1.企业级开发标配

超过60%的Java项目都使用Spring生态(数据来源:JetBrains开发者报告)。

2.简化复杂问题

通过IoC和DI,告别new关键字满天飞的代码。

3.职业竞争力

几乎所有Java岗位都要求掌握Spring框架。

Spring的江湖地位

Spring框架就像Java世界的”瑞士军刀” - 从单体应用到微服务,从数据库操作到安全认证,它几乎无所不能。

二、Spring的技术特色与优势

Spring是一个轻量级的开源Java框架,它通过提供基础的依赖注入(DI)、控制反转(IoC)以及面向切面编程(AOP)等功能,帮助开发者简化Java应用的开发。Spring不仅支持开发企业级的Web应用,还能与各种中间件和技术栈无缝集成。

Spring的四大杀手锏

1.IoC与DI:颠覆传统编程思维

• IoC(控制反转)

将对象的创建和生命周期管理交给Spring容器,而不是手动管理。

• DI(依赖注入)

IoC的一种实现方式,自动将依赖关系注入类中,解耦类之间的关系。

传统方式:程序员手动new对象 → 紧耦合

Spring方式:容器自动管理对象 → 松耦合

对比案例:

// 传统方式:手动创建对象
UserService userService = new UserServiceImpl();// Spring方式:自动注入依赖
@Autowired
private UserService userService;

2.AOP:像手术刀一样精准增强功能

AOP(面向切面编程)可以在不修改原始代码的情况下,增加额外功能。

应用场景

日志记录、事务管理、权限校验等。

原理

通过动态代理实现功能注入。

3.模块化设计:按需取用的乐高积木

Spring框架提供了多种子模块,开发者可以根据项目需求灵活选择使用:
在这里插入图片描述

4.开发效率:告别XML地狱

通过自动化配置和约定大于配置的原则,Spring大大减少了开发过程中的配置工作。

效率对比:

• 传统SSH项目:500+行XML配置

• Spring Boot项目:0行XML配置

Spring的核心思想

是通过控制反转(IoC)和依赖注入(DI),帮助开发者解耦应用组件,实现更加灵活、可测试的代码。

三、手把手实战:第一个Spring程序

创建一个最简单的Spring Boot应用程序,从而帮助你快速上手。

步骤1:项目初始化(关键配置图解)

1.访问start.spring.io。

如下是https://start.spring.io 页面:
在这里插入图片描述

2.配置项如下:

• Project:选择Maven Project

• Language:选择Java

• Spring Boot:

推荐使用Spring Boot 3.x(最新稳定版)

• Group:com.example

• Artifact:spring-demo

• Name:spring-demo

• Description:Spring Boot入门示例

• Packaging:选择Jar

• Java Version:

建议选择17(LTS长期支持版本)。

3.在“Dependencies”部分选择:

• Spring Web

• Spring Boot DevTools(支持热部署)

4.点击Generate按钮,下载生成的项目压缩包。

步骤2:解压并导入到IDE

1.下载后,将项目解压并导入IDE(如IntelliJ IDEA或Eclipse)。

2.IDE会自动加载Maven依赖,确保项目正常工作。

导入到IDE后,项目的目录结构通常如下:

spring-demo
├── pom.xml                          // 项目的Maven配置文件
└── src└── main└── java└── com└── example└── springdemo├── SpringDemoApplication.java  // Spring Boot 启动类├── GreetingService.java      // 服务接口└── GreetingServiceImpl.java  // 服务实现类└── resources├── application.properties  // 默认配置文件└── static                  // 静态资源(如HTML、JS、CSS等)└── ...└── templates               // 模板文件(如Thymeleaf模板等)└── ...

目录结构解析

• pom.xml

Maven 配置文件,包含项目依赖、插件、构建配置等信息。

在Spring Initializr生成的项目中,会自动为你生成此文件。

• SpringDemoApplication.java - Spring Boot 启动类。

• GreetingService.java - 服务接口。

• GreetingServiceImpl.java - 服务实现类。

• src/main/resources/

• application.properties - Spring Boot 配置文件。

• static/ - 存放静态资源的目录。

• templates/ - 存放模板文件的目录。

pom.xml文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 项目的唯一标识,包含groupId、artifactId和version --><groupId>com.example</groupId>   <!-- 设置GroupID,代表组织或公司 --><artifactId>spring-demo</artifactId>   <!-- 设置ArtifactID,代表项目名称 --><version>0.0.1-SNAPSHOT</version>  <!-- 设置版本号 --><name>spring-demo</name>   <!-- 项目名称 --><description>Spring Boot入门示例</description>   <!-- 项目描述 --><!-- 设置父级Spring Boot的pom文件 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>   <!-- Spring Boot的父级pom --><version>2.7.8</version>   <!-- 设置Spring Boot版本号 --><relativePath/>  <!-- 依赖父级Spring Boot的pom --></parent><!-- 项目依赖部分 --><dependencies><!-- Web开发支持,包含了Spring MVC、Tomcat--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>  </dependency><!-- 开发工具支持,支持热部署 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency><!-- 测试支持工具,包含JUnitMockito--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!-- 配置项目构建 --><build><plugins><!-- 使用Spring Boot插件构建应用 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

解析:

• spring-boot-starter-web:提供Web开发相关的依赖,包含Spring MVC和内嵌的Tomcat容器。

• spring-boot-devtools:用于开发时支持热部署,改动代码后无需重新启动应用即可看到效果。

• spring-boot-starter-test:包含JUnit、Mockito等常用的测试工具包,便于单元测试。

• spring-boot-maven-plugin:用于打包Spring Boot应用并生成可执行JAR文件,支持通过mvn spring-boot:run启动应用。

步骤 3:创建主程序文件

创建SpringDemoApplication.java,代码如下:

package com.example.springdemo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication  // 标识这是Spring Boot的入口类
public class SpringDemoApplication {public static void main(String[] args) {// 启动Spring Boot应用SpringApplication.run(SpringDemoApplication.class, args);}
}

• @SpringBootApplication注解标记了这个类是Spring Boot的启动类。

• SpringApplication.run()方法启动了Spring Boot应用并自动配置。

步骤 4:创建一个简单的Bean

创建一个接口GreetingService.java和它的实现类GreetingServiceImpl.java,用来展示Spring的依赖注入(DI)功能。代码如下:

package com.example.springdemo;public interface GreetingService {void greet();
}
package com.example.springdemo;import org.springframework.stereotype.Component;@Component  // 让Spring管理这个类为一个Bean
public class GreetingServiceImpl implements GreetingService {@Overridepublic void greet() {System.out.println("Hello, Spring Boot!");}
}

• @Component注解让Spring容器管理这个类,并将它注册为一个Bean。

步骤 5:使用Spring容器

修改主程序SpringDemoApplication.java,让Spring容器自动注入GreetingService。

package com.example.springdemo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringDemoApplication implements CommandLineRunner {@Autowired // 自动注入的魔法就在这里!private GreetingService greetingService;  // 自动注入GreetingServicepublic static void main(String[] args) {SpringApplication.run(SpringDemoApplication.class, args);}@Overridepublic void run(String... args) throws Exception {greetingService.greet();  // 调用GreetingService的greet方法}
}

• @Autowired注解使Spring自动注入GreetingService。

• CommandLineRunner接口的run方法会在应用启动后执行,打印Hello, Spring Boot!。

步骤 6:运行程序

1.在IDE中运行SpringDemoApplication类。

2.控制台输出:

Hello, Spring Boot!

总结:

DI的体现

1.依赖注入(DI)是指Spring容器负责将依赖的对象自动注入到需要使用这些对象的类中。

2.本例通过@Autowired注解,Spring容器自动将GreetingServiceImpl注入到GreetingService接口中,解耦了类之间的依赖关系。

四、总结

1.关键收获

• 掌握Spring两大核心:IoC(控制反转)与DI(依赖注入)。

• 完成首个Spring Boot应用的创建与运行。

• 理解注解驱动开发的优势。

相关文章:

Spring - 简单实现一个 Spring 应用

一、为什么需要学习Spring框架&#xff1f; 1.企业级开发标配 超过60%的Java项目都使用Spring生态&#xff08;数据来源&#xff1a;JetBrains开发者报告&#xff09;。 2.简化复杂问题 通过IoC和DI&#xff0c;告别new关键字满天飞的代码。 3.职业竞争力 几乎所有Java岗…...

css 数字从0开始增加的动画效果

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在有些时候比如在做C端项目的时候&#xff0c;页面一般需要一些炫酷效果&#xff0c;比如数字会从小值自动加到数据返回的值 css 数字从0开始增加的动画效果 分析&#xff1a; 提示&#xff1a;这里填…...

第十六届蓝桥杯 2025 C/C++组 旗帜

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; P12340 [蓝桥杯 2025 省 AB/Python B 第二场] 旗帜 -…...

利用无事务方式插入数据库解决并发插入问题

一、背景 由于项目中同一个网元&#xff0c;可能会被多个不同用户操作&#xff0c;而且操作大部分都是以异步子任务形式进行执行&#xff0c;这样就会带来并发写数据问题&#xff0c;本文通过利用无事务方式插入数据库解决并发插入问题&#xff0c;算是解决问题的一种思路&…...

云计算市场的重新分类研究

云计算市场传统分类方式&#xff0c;比如按服务类型分为IaaS、PaaS、SaaS&#xff0c;或者按部署模式分为公有云、私有云、混合云。主要提供计算资源、存储和网络等基础设施。 但随着AI大模型的出现&#xff0c;云计算市场可以分为计算云和智算云&#xff0c;智算云主要是AI模…...

【C语言练习】014. 使用数组作为函数参数

014. 使用数组作为函数参数 014. 使用数组作为函数参数示例1&#xff1a;使用数组作为函数参数并修改数组元素函数定义输出结果 示例2&#xff1a;使用数组作为函数参数并计算数组的平均值函数定义输出结果 示例3&#xff1a;使用二维数组作为函数参数函数定义输出结果 示例4&a…...

Java关键字解析

Java关键字是编程语言中具有特殊含义的保留字&#xff0c;不能用作标识符&#xff08;如变量名、类名等&#xff09;。Java共有50多个关键字&#xff08;不同版本略有差异&#xff09;&#xff0c;下面我将分类详细介绍这些关键字及其使用方式。 一、数据类型相关关键字 1. 基…...

突破zero-RL 困境!LUFFY 如何借离线策略指引提升推理能力?

在大模型推理能力不断取得突破的今天&#xff0c;强化学习成为提升模型能力的关键手段。然而&#xff0c;现有zero-RL方法存在局限。论文提出的LUFFY框架&#xff0c;创新性地融合离线策略推理轨迹&#xff0c;在多个数学基准测试中表现卓越&#xff0c;为训练通用推理模型开辟…...

React Native本地存储方案总结

1. AsyncStorage&#xff08;键值对存储&#xff09; 适用场景&#xff1a;简单键值对存储&#xff08;如用户配置、Token、缓存数据&#xff09;。特点&#xff1a;异步、轻量、API 简单&#xff0c;但性能一般&#xff0c;不推荐存储大量数据。安装&#xff1a;npm install …...

基于Redis实现-附近商铺查询

基于Redis实现-附近查询 这个功能将使用到Redis中的GEO这种数据结构来实现。 1.GEO相关命令 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入到了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据&#…...

【java WEB】恢复补充说明

Server 出现javax.servlet.http.HttpServlet", according to the project’s Dynamic Web Module facet version (3.0), was not found on the Java Build Path. 右键项目 > Properties > Project Facets。Dynamic Web Module facet version选4.0即可 还需要在serv…...

安川机器人常见故障报警及解决办法

机器人权限设置 操作权限设置(如果密码不对,就证明密码被人修改) 编辑模式密码:无(一把钥匙,默认) 管理模式密码:999999999(9个9,二把钥匙) 安全模式密码:555555555(9个5,三把钥匙,权限最高,有的型号机器人,没有此模式,但最高密码为安全模式密码) 示教器…...

tiktok web X-Bogus X-Gnarly 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 部分python代码 import req…...

kes监控组件安装

环境准备 创建监控用户 useradd -m -s /bin/bash -d /home/kmonitor kmonitor passwd k_monitor usermod –a –G kingbase kmonitor 检查java版本 java –version [kmonitorkingbase node_exporter]$ java -version java version "1.8.0_341" Java(TM) SE …...

React-Native Android 多行被截断

1. 问题描述&#xff1a; 如图所示&#xff1a; 2. 问题解决灵感&#xff1a; 使用相同的react-native代码&#xff0c;运行在两个APP&#xff08;demo 和 project&#xff09;上。demo 展示正常&#xff0c;project 展示不正常。 对两个页面截图&#xff0c;对比如下。 得出…...

深度学习【Logistic回归模型】

回归和分类 回归问题得到的结果都是连续的&#xff0c;比如通过学习时间预测成绩 分类问题是将数据分成几类&#xff0c;比如根据邮件信息将邮件分成垃圾邮件和有效邮件两类。 相比于基础的线性回归其实就是增加了一个sigmod函数。 代码 import matplotlib.pyplot as plt i…...

数据科学与计算

1.设计目标与安装 Seaborn 是一个建立在 Matplotlib 基础之上的 Python 数据可视化库&#xff0c;专注于绘制各种统计图形&#xff0c;以便更轻松地呈现和理解数据。Seaborn 的设计目标是简化统计数据可视化的过程&#xff0c;提供高级接口和美观的默认主题&#xff0c;使得用…...

Swift与iOS内存管理机制深度剖析

前言 内存管理是每一位 iOS 开发者都绕不开的话题。虽然 Swift 的 ARC&#xff08;自动引用计数&#xff09;极大简化了开发者的工作&#xff0c;但只有深入理解其底层实现&#xff0c;才能写出高效、健壮的代码&#xff0c;避免各种隐蔽的内存问题。本文将从底层原理出发&…...

怎样给MP3音频重命名?是时候管理下电脑中的音频文件名了

在处理大量音频文件时&#xff0c;给这些文件起一个有意义的名字可以帮助我们更高效地管理和查找所需的内容。通过使用专业的文件重命名工具如简鹿文件批量重命名工具&#xff0c;可以极大地简化这一过程。本文将详细介绍如何利用该工具对 MP3 音频文件进行重命名。 步骤一&am…...

当AI浏览器和AI搜索替代掉传统搜索份额时,老牌的搜索引擎市场何去何从。

AI搜索与传统搜索优劣势分析 AI搜索优势 理解和处理查询方式更智能&#xff1a;利用自然语言处理&#xff08;NLP&#xff09;和机器学习技术&#xff0c;能够更好地理解用户的意图和上下文&#xff0c;处理复杂的问答、长尾问题以及多轮对话&#xff0c;提供更为精准和相关的…...

快速上手非关系型数据库-MongoDB

简介 MongoDB 是一个基于文档的 NoSQL 数据库&#xff0c;由 MongoDB Inc. 开发。 NoSQL&#xff0c;指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写&#xff0c;是对不同于传统的关系型数据库的数据库管理系统的统称。 MongoDB 的设计理念是为了应对大数据量、…...

【C++学习笔记】深入理解虚函数和多态

文章目录 1. 基本概念1.1 虚函数1.2 虚函数表1.3 虚函数表指针1.4 虚函数表在支持多态方面的工作原理 2. 类对象在内存中的布局参考 1. 基本概念 1.1 虚函数 类的成员函数&#xff0c;并不占用类对象的内存空间。 类中有虚函数&#xff0c;编译器会向类中插入一个看不见的成…...

STM32F103C8T6信息

STM32F103C8T6 完整参数列表 一、核心参数 内核架构‌ ARM Cortex-M3 32位RISC处理器 最大主频&#xff1a;72 MHz&#xff08;基于APB总线时钟&#xff09; 运算性能&#xff1a;1.25 DMIPS/MHz&#xff08;Dhrystone 2.1基准&#xff09; 总线与存储‌ 总线宽度&#xff…...

用手机相册教我数组概念——照片分类术[特殊字符][特殊字符]

目录 前言一、现实场景1.1 手机相册的照片管理1.2 照片分类的需求 二、技术映射2.1 数组与照片分类的对应关系2.2 数组索引与照片标签的类比 三、知识点呈现3.1 数组的基本概念3.2 数组在编程中的重要性3.3 数组的定义与初始化3.4 数组的常见操作&#xff08;增删改查&#xff…...

Node.js CSRF 保护指南:示例及启用方法

解释 CSRF 跨站请求伪造 (CSRF/XSRF) 是一种利用用户权限劫持会话的攻击。这种攻击策略允许攻击者通过诱骗用户以攻击者的名义提交恶意请求,从而绕过我们的安全措施。 CSRF 攻击之所以可能发生,是因为两个原因。首先,CSRF 攻击利用了用户无法辨别看似合法的 HTML 元素是否…...

【Linux】VSCode用法

描述 部分图片和经验来源于网络&#xff0c;若有侵权麻烦联系我删除&#xff0c;主要是做笔记的时候忘记写来源了&#xff0c;做完笔记很久才写博客。 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 安装环境及运行C/C 1.1 安装及配置步骤 1.2 运…...

来聊聊JVM中安全点的概念

文章目录 写在文章开头详解safepoint基本概念什么是安全点?为什么需要安全点JVM如何让线程跑到最近的安全点线程什么时候需要进入安全点JVM如何保证线程高效进入安全点如何设置安全点用一次GC解释基于安全点的STW实践-基于主线程休眠了解安全点的工作过程代码示例基于日志印证…...

【AI面试准备】负责所有Al产品的模型能力评估及测试,保障AI产品的质量

面试岗位提出这个要求:负责所有Al产品的模型能力评估及测试,保障AI产品的质量。 目录 **一、AI产品模型评估的核心框架**1. **评估维度全景图**2. **质量保障全流程****二、关键模型类型评估策略**1. **分类模型(如推荐系统)**2. **生成模型(如GPT、Stable Diffusion)**…...

Nginx — http、server、location模块下配置相同策略优先级问题

一、配置优先级简述 在 Nginx 中&#xff0c;http、server、location 模块下配置相同策略时是存在优先级的&#xff0c;一般遵循 “范围越小&#xff0c;优先级越高” 的原则&#xff0c;下面为你详细介绍&#xff1a; 1. 配置继承关系 http 块&#xff1a;作为全局配置块&…...

mysql数据库备份与恢复方法

一、备份方法 逻辑备份&#xff08;基于SQL语句&#xff09; 使用mysqldump工具 全库备份&#xff1a;mysqldump -u root -p --all-databases > all_databases_backup.sql单库备份&#xff1a;mysqldump -u root -p jztdb > full_backup.sql排除特定表&#xff1a;--igno…...