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

news/2024/9/21 17:30:00 标签: spring, 学习, java, 后端, web
webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

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 的入口注解:

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

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

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



http://www.niftyadmin.cn/n/5669163.html

相关文章

【算法】算法思想合集

数组分块 将数组分成具有某些特征的段使用双指针算法(如果是数组,使用下标充当指针)存在信息丢失的问题,可以考虑从后向前进行利用单调性进行定性分析(盛最多的水) 滑动窗口同向移动的双指针出窗口一般是w…

Oracle11g安装配置详细教程

Oracle卸载重装比较麻烦,尽量一次成功,如果遇到问题实在解决不了,请后台私信我! 1、下载oracle安装包 下载方式1:官网下载地址: https://docs.oracle.com/en/database/oracle/oracle-database/index.html …

Net core 环境变量

Environment.ExpandEnvironmentVariables(“资源名称”)

张养浩,文坛政坛的双重巨匠

张养浩,字希孟,号云庄,又称齐东野人,生于元世祖至元七年(公元1270年),卒于元英宗至治三年(公元1329年),享年59岁。他是中国元代著名的文学家、政治家&#xf…

SpringDataJpa自关联映射时出现StackOverflowError

使用Jpa自关联时,存在子数据的记录会报内存溢出问题StackOverflowError 原因: 使用了 lombok 插件中的Data注解来标注类,生成 gettet/setter 以及 toString lombok 在生成时会出现循环比较两类中的 hashcode,导致内存溢出。 解决…

海外大带宽服务器连接失败怎么办?

在全球化日益加深的今天,海外大带宽服务器已成为企业拓展国际市场、提升业务效率的重要工具。然而,面对复杂多变的网络环境和技术挑战,服务器连接失败的问题时有发生,这不仅影响了企业的正常运营,还可能带来经济损失和…

安卓13设置动态显示隐藏第一页的某一项 动态显示隐藏无障碍 android13设置动态显示隐藏第一页的某一项

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1修改方法14.2修改方法25.编译6.彩蛋1.前言 有时候,我们的设置里面显示的信息,需要根据不同的情况显示不同的信息,例如,动态的显示或者隐藏 “无障碍” 这一项。 2.问题分析 像这个问题…

PHP基础语法入门指南

前言 PHP(Hypertext Preprocessor)是一种广泛使用的开源服务器端脚本语言,特别适合Web开发,并可以嵌入到HTML中使用。PHP能够执行动态内容、创建交互式的Web页面、与数据库进行通信等。本文将带领你走进PHP的世界,从最…