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

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;
    
        @Autowired
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    }
    
  2. Setter 注入:通过 Setter 方法注入依赖,Spring 容器会自动调用 Setter 方法。
    @Service
    public class MyService {
        private MyRepository repository;
    
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    }
    
  3. 字段注入:直接在类的字段上使用 @Autowired 注解。尽量避免使用这种方式,因为它不利于单元测试和可维护性。
    @Service
    public class MyService {
        @Autowired
        private MyRepository repository;
    }
    
3.4 依赖注入的应用

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

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



http://www.kler.cn/a/311748.html

相关文章:

  • ODOO学习笔记(3):Odoo和Django的区别是什么?
  • 【CICD】GitLab Runner 和执行器(Executor
  • LED和QLED的区别
  • SpringBoot(十)SpringBoot使用QQ邮箱stmp发送邮件
  • 【C/C++】CreateThread 与 _beginthreadex, 应该使用哪一个?为什么?
  • Java项目实战II基于Spring Boot的药店管理系统的设计与实现(开发文档+数据库+源码)
  • 第五届“马栏山杯”国际音视频算法大赛创新应用赛投票环节正式启动啦!
  • Json和Http专栏
  • linux如何查看当前的目录所在位置
  • GDPU 信息安全 天码行空1 用Wireshark分析典型TCP/IP体系中的协议
  • 【vue】vue3+ts对接科大讯飞大模型3.5智能AI
  • MongoDB的安装和使用
  • React Zustand状态管理库的使用
  • 性能优化一:oracle 锁的原则
  • 手机实时提取SIM卡打电话的信令和声音-新的篇章(一、可行的方案探讨)
  • 【简单记录】Linux系统安装ZooKeeper
  • 【电路笔记】-运算放大器比较器
  • 在线查看 Android 系统源代码 Git repositories on android
  • YOLOv9改进策略【注意力机制篇】| MCAttention 多尺度交叉轴注意力
  • vue和thinkphp路由伪静态配置
  • 前端vue-子组件对于父组件的传值的约束
  • cuda与机器学习
  • C++ ——string的模拟实现
  • 字节跳动的微服务独家面经
  • 详细分析Pytorch中的register_buffer基本知识(附Demo)
  • 9.19工作笔记