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-core
和spring-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.properties
或application.yml
。src/test/java
:单元测试代码目录,存放测试类。src/test/resources
:测试资源文件目录。pom.xml
(Maven 项目)或build.gradle
(Gradle 项目):项目构建管理工具的配置文件,用于管理依赖项和构建过程。
2. Spring 入门程序
2.1 创建一个简单的 Spring 应用
可以使用 Spring Boot 来创建一个简单的 Spring 应用,下面是步骤:
-
使用 Spring Initializr 创建项目:
你可以访问 Spring Initializr 来快速生成 Spring 项目。选择合适的依赖,比如 Spring Web 和 Spring Boot DevTools,然后下载项目。 -
编写 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!"; } }
-
运行项目:
在项目根目录下运行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 支持以下几种方式的依赖注入:
- 构造器注入:通过构造函数注入依赖。开发者可以通过构造函数定义依赖项。
@Service public class MyService { private final MyRepository repository; @Autowired public MyService(MyRepository repository) { this.repository = repository; } }
- Setter 注入:通过 Setter 方法注入依赖,Spring 容器会自动调用 Setter 方法。
@Service public class MyService { private MyRepository repository; @Autowired public void setRepository(MyRepository repository) { this.repository = repository; } }
- 字段注入:直接在类的字段上使用
@Autowired
注解。尽量避免使用这种方式,因为它不利于单元测试和可维护性。@Service public class MyService { @Autowired private MyRepository repository; }
3.4 依赖注入的应用
依赖注入广泛应用于实际开发中,尤其是在控制器、服务、数据访问层等需要频繁交互的模块之间。通过依赖注入,模块之间可以解耦,同时便于测试。
例如,在构建 Web 应用时,控制器可能依赖于服务类,而服务类又依赖于数据访问层,Spring 的 DI 能够自动管理这些依赖,简化开发过程。