Spring - 简单实现一个 Spring 应用

news2025/7/19 2:42:48

一、为什么需要学习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 {

    @Override
    public 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;  // 自动注入GreetingService

    public static void main(String[] args) {
        SpringApplication.run(SpringDemoApplication.class, args);
    }

    @Override
    public 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应用的创建与运行。

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

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

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

相关文章

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;算是解决问题的一种思路&…

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

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

基于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;使得用…

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

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

快速上手非关系型数据库-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;编译器会向类中插入一个看不见的成…

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实践-基于主线程休眠了解安全点的工作过程代码示例基于日志印证…

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

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

线性代数—向量与矩阵的范数(Norm)

参考链接&#xff1a; 范数&#xff08;Norm&#xff09;——定义、原理、分类、作用与应用 - 知乎 带你秒懂向量与矩阵的范数(Norm)_矩阵norm-CSDN博客 什么是范数&#xff08;norm&#xff09;&#xff1f;以及L1,L2范数的简单介绍_l1 norm-CSDN博客 范数&#xff08;Norm…