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

Spring系统学习(一)——初识Spring框架

1. Spring 框架概述

1.1 什么是 Spring?

Spring 是一个流行的基于 Java 的开源框架,旨在简化企业级应用程序的开发。最初,它是为了简化 Java 企业版(Java EE)的复杂性而设计的,经过不断发展,Spring 已经成为支持各类应用开发的全栈生态系统,包括 web 开发、数据访问、消息服务等。它的核心理念是控制反转(IoC)和依赖注入(DI),这有助于提高代码的模块化、可测试性和可维护性。

1.2 Spring 框架的优点
  • 松耦合架构:通过控制反转和依赖注入,Spring 允许开发者轻松地管理和组织组件,使得模块之间的依赖关系变得松散,提高了代码的可维护性。
  • 模块化:Spring 的各个功能模块是独立的,你可以只选用需要的部分,而不用加载整个框架。
  • 强大的社区支持:Spring 社区活跃,文档丰富,问题也能很快得到解答。
  • 简化了企业级 Java 开发:Spring 抽象了许多复杂的 Java EE 功能,比如事务管理、数据持久化等,使开发者可以专注于业务逻辑而不是基础设施代码。
1.3 Spring 的体系结构

Spring 框架是由多个模块构成的,以下是主要模块的介绍:

  • Spring Core Container(核心容器):负责 IoC 和 DI,核心包是 spring-corespring-beans,这是 Spring 的基础模块。
  • Spring AOP(面向切面编程):支持面向切面的编程,允许在不修改代码的情况下为现有功能添加新行为,比如日志、事务管理等。
  • Spring Data Access(数据访问):为持久层提供了对 JDBC、ORM(如 Hibernate)、NoSQL 数据库的支持。
  • Spring Web(Web 开发):用于开发 Web 应用程序,Spring MVC 是其中的核心部分,简化了基于 Servlet 的 Web 应用开发。
  • Spring Security:提供强大的安全管理功能,如身份验证和授权控制。
  • Spring Boot:用于快速创建 Spring 应用,提供了开箱即用的配置和部署。
1.4 Spring 5 的新特性
  • 响应式编程:Spring 5 引入了对响应式编程模型的支持,如 Spring WebFlux,它可以更好地处理非阻塞、异步的请求,尤其适合高并发应用场景。
  • Java 8+ 特性支持:Spring 5 开始要求 Java 8 作为最低版本,并充分利用了 Java 8 的新特性,比如 Lambda 表达式、Stream API 等。
  • Kotlin 支持:Spring 5 提供了对 Kotlin 编程语言的更好支持,让开发者可以使用 Kotlin 编写 Spring 应用。
  • 更加轻量级:Spring 5 通过优化和减少依赖,使得应用变得更加轻量化,启动和运行效率更高。
1.5 Spring 项目的结构与目录

当我们创建一个 Spring 项目时,通常会看到以下目录结构:

  • src/main/java:Java 源代码目录,存放业务逻辑相关的代码。
  • src/main/resources:资源文件目录,存放配置文件、静态资源等,如 application.propertiesapplication.yml
  • src/test/java:单元测试代码目录,存放测试类。
  • src/test/resources:测试资源文件目录。
  • pom.xml(Maven 项目)或 build.gradle(Gradle 项目):项目构建管理工具的配置文件,用于管理依赖项和构建过程。

2. Spring 入门程序

2.1 创建一个简单的 Spring 应用

可以使用 Spring Boot 来创建一个简单的 Spring 应用,下面是步骤:

  1. 使用 Spring Initializr 创建项目
    你可以访问 Spring Initializr 来快速生成 Spring 项目。选择合适的依赖,比如 Spring Web 和 Spring Boot DevTools,然后下载项目。

  2. 编写 Hello World 应用
    src/main/java 中创建一个主类,并加上 Spring Boot 的入口注解:

    package com.example.demo;import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
    public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
    }@RestController
    class HelloController {@GetMapping("/hello")public String hello() {return "Hello, Spring!";}
    }
    
  3. 运行项目
    在项目根目录下运行 mvn spring-boot:run 或直接运行 DemoApplication 类,访问 http://localhost:8080/hello,你将看到页面返回 “Hello, Spring!”。

3. 控制反转(IoC)与依赖注入(DI)

3.1 控制反转(IoC)的概念

控制反转(Inversion of Control, IoC)是 Spring 框架的核心思想之一。简单来说,IoC 是指对象的创建和依赖关系的管理不再由开发者手动处理,而是由 Spring 容器自动管理。开发者只需声明依赖,容器会负责依赖的注入。

3.2 依赖注入(DI)的概念

依赖注入(Dependency Injection, DI)是 IoC 的具体实现方式。它允许开发者在需要的地方声明依赖,而不用手动去创建它们。Spring 容器会自动根据配置,将合适的对象注入到依赖的位置。

3.3 依赖注入的类型

Spring 支持以下几种方式的依赖注入:

  1. 构造器注入:通过构造函数注入依赖。开发者可以通过构造函数定义依赖项。
    @Service
    public class MyService {private final MyRepository repository;@Autowiredpublic MyService(MyRepository repository) {this.repository = repository;}
    }
    
  2. Setter 注入:通过 Setter 方法注入依赖,Spring 容器会自动调用 Setter 方法。
    @Service
    public class MyService {private MyRepository repository;@Autowiredpublic void setRepository(MyRepository repository) {this.repository = repository;}
    }
    
  3. 字段注入:直接在类的字段上使用 @Autowired 注解。尽量避免使用这种方式,因为它不利于单元测试和可维护性。
    @Service
    public class MyService {@Autowiredprivate MyRepository repository;
    }
    
3.4 依赖注入的应用

依赖注入广泛应用于实际开发中,尤其是在控制器、服务、数据访问层等需要频繁交互的模块之间。通过依赖注入,模块之间可以解耦,同时便于测试。

例如,在构建 Web 应用时,控制器可能依赖于服务类,而服务类又依赖于数据访问层,Spring 的 DI 能够自动管理这些依赖,简化开发过程。


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 蓝桥杯2024省C
  • P1439 【模板】最长公共子序列 (线性DP,LCS + LIS)
  • ElementUI 用span-method实现循环el-table组件的合并行功能
  • linux如何查看当前的目录所在位置
  • Python 二级考试
  • 变化检测(Change Detection)
  • 4.提升客户服务体验:ChatGPT在客服中的应用(4/10)
  • 软件设计师——操作系统
  • AI问答-HTTP:理解 Content-Disposition
  • ovirt error: Network not found: no network with matching name ‘vdsm-ovirtmgmt‘
  • 重生归来之挖掘stm32底层知识(1)——寄存器
  • 如何使用Privoxy将SOCKS5代理转换为HTTP代理?
  • mysql中的json查询
  • yolo自动化项目实例解析(三)重构 1.85
  • 【CSS】选择器(基础选择器、复合选择器、属性匹配选择器、结构伪类选择器、伪元素选择器)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 03Go 类型总结
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • HTML5新特性总结
  • IndexedDB
  • JavaScript 奇技淫巧
  • Js基础——数据类型之Null和Undefined
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 番外篇1:在Windows环境下安装JDK
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 模型微调
  • 我看到的前端
  • 学习笔记TF060:图像语音结合,看图说话
  • ionic入门之数据绑定显示-1
  • PostgreSQL之连接数修改
  • 阿里云服务器购买完整流程
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​ubuntu下安装kvm虚拟机
  • ​如何使用QGIS制作三维建筑
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • (1)(1.9) MSP (version 4.2)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (Java)【深基9.例1】选举学生会
  • (LeetCode C++)盛最多水的容器
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (九)信息融合方式简介
  • (论文阅读11/100)Fast R-CNN
  • (十七)Flink 容错机制
  • (新)网络工程师考点串讲与真题详解
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)u-boot-nand.bin的下载
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • .NET Core Web APi类库如何内嵌运行?
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .Net Core中Quartz的使用方法
  • .NET 依赖注入和配置系统
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈