【Spring学习】

Spring学习

简介

Spring 是一个开源的 Java 企业级开发框架,最核心的特点是:

  • IOC(控制反转)
  • AOP(面向切面编程)

它有完整的生态:

  • 🚀 Spring Boot:用于快速构建服务
  • 🔒 Spring Security:做权限认证
  • ☁️ Spring Cloud:做微服务

现在很多 Java 项目基本都是以 Spring Boot 为基础搭建的。


核心特点

IOC(控制反转)

简介
  • Inversion of Control

  • 它是一种思想,核心理念是:把"创建对象 + 管理依赖"的控制权从代码中交给框架(比如 Spring)。

  • DI(依赖注入)

    • Dependency Injection
    • 它是实现 IOC 的一种方式,也是 Spring 中最常用的方式(使用注解 @Autowired)。

关系总结:

概念 说明
IOC 理念(控制权的转移)
DI 手段(实现方式)

在 Spring 中:

  • DI 让我们不用手动 new 对象
  • 框架会根据配置自动注入依赖

Bean

Spring的核心理念之一是 IOC(控制反转) ,即通过 Spring 容器来管理对象的创建和生命周期。这些对象都可以称为 Bean


简介
  • Bean 是指由 Spring 容器管理的一个对象
  • Spring 使用 IOCDI 机制来管理应用程序中的对象
  • Bean 可以是任何类的实例,Spring 会负责它的创建、配置和生命周期管理

特点
  • 由 Spring 容器(通常是 ApplicationContext)管理的对象
  • 在 Spring 配置文件中或通过注解(如 @Component@Service@Repository@Controller 等)定义的,并由 Spring 容器自动创建和管理。
  • Spring 容器会负责实例化这些对象,注入它们的依赖关系,并在应用程序运行时进行管理。

生命周期
  • 在容器启动时被创建(实例化)
  • 在应用程序的生命周期内保持可用
  • Spring 管理其完整生命周期,包括初始化和销毁过程

定义方式

1.通过注解定义,使用注解标记类为 Spring Bean:

java 复制代码
@Service
public class UserService {
    // 业务逻辑
}

2.通过 XML 配置定义 Bean:在 applicationContext.xml 文件中,通过 标签定义 Bean。

java 复制代码
<bean id="userService" class="com.example.UserService"/>

3.通过 Java 配置类定义 Bean:使用 @Configuration@Bean 等注解来定义 Bean。

java 复制代码
@Configuration
public class AppConfig {

    @Bean
    public UserService userService() {
        return new UserService();
    }
}

作用域(Scope)

Spring 允许你为 Bean 配置不同的作用域(scope),决定它的生命周期和创建时机。常见的作用域有:

  • singleton:默认作用域,Spring 容器中只会有一个 Bean 实例。
  • prototype:每次请求都会创建一个新的 Bean 实例。
  • request、session、application 等:这些是基于 web 应用的特定作用域,通常用于 web 项目中。

AOP切面编程

简介

AOP(面向切面编程)是一种编程思想,它的目标是将程序中那些 横切关注点(cross-cutting concerns)从主业务逻辑中分离出来。

📌 举例说明

在很多业务方法中都要做这些事:

  • 记录日志
  • 权限验证
  • 异常处理
  • 性能监控
  • 事务管理

这些跟业务逻辑(比如"下单"、"支付"、"查询用户信息")无关但又必须做的操作就是横切关注点


功能

把通用代码抽出来统一处理,让业务代码更干净、更专注。


实现方式

Spring 提供了基于 代理机制(Proxy) 的 AOP 实现方式:

  • JDK 动态代理:针对接口
  • CGLIB 动态代理:针对类

核心概念
名称 说明
切面(Aspect) 封装横切逻辑的类,比如日志、事务、权限检查等
连接点(Join Point) 程序中可以插入切面逻辑的位置(通常是方法调用)
切入点(Pointcut) 定义要拦截哪些方法
通知(Advice) 指定在什么时候执行横切逻辑(比如:方法前/后/异常时)
织入(Weaving) 将切面代码织入到目标对象的过程

应用实例

日常开发中我们可能感觉不到AOP的存在,是因为很多AOP功能是Spring框架"自动实现"的,开发者实际上是在隐式使用AOP。

功能 实现方式 AOP实现机制
@Transactional 注解 开启事务管理 通过AOP织入事务逻辑
@Async 注解 方法异步调用 通过AOP织入异步代理逻辑
@Cacheable 注解 缓存处理 通过AOP织入缓存判断逻辑
@PreAuthorize 注解 方法级安全控制 基于Spring Security的AOP实现
Controller参数校验 @Valid 注解校验 通过AOP织入参数校验逻辑
@Retryable 注解 方法失败自动重试 基于Spring Retry的AOP实现

实现特点:

  • 这些功能本质上都是通过Spring AOP或AspectJ实现的
  • Spring Boot自动配置会为这些功能自动创建代理对象
  • 默认使用运行时织入(Runtime Weaving)方式
  • 在方法内部调用时可能失效(因为绕过了代理机制)

Spring 生态系统

"生态"指的是围绕Spring核心框架,衍生出来的一整套子项目和解决方案,它们可以无缝协作,覆盖一个大型项目从开发、测试、部署、运维到监控的整个生命周期。


核心组件
模块 功能描述
Spring Framework 核心框架,提供IOC、AOP、事务管理等基础功能
Spring Boot 快速构建独立运行的Spring应用,简化配置、开箱即用
Spring MVC/WebFlux MVC是传统同步模型,WebFlux是响应式非阻塞模型
Spring Data 简化数据库操作(支持JPA、MongoDB、Redis等)
Spring Security 提供认证和授权的安全框架
Spring Cloud 微服务架构解决方案(服务注册发现、配置中心、断路器等)
Spring Batch 批处理任务解决方案(大数据量、定时处理)
Spring Integration 面向消息驱动架构的集成方案(适合构建分布式系统)
Spring Test 提供测试支持,方便进行单元测试和集成测试

生态优势

统一风格 :所有模块遵循同一套设计理念,学习一个就能用一片

高扩展性 :可以单独使用部分模块,也能组合多个模块构建复杂系统

社区活跃 :拥有强大的开源社区和丰富的生态资源

兼容性好 :与Docker、Kubernetes、主流消息队列、数据库和云平台无缝集成

持续演进:定期更新迭代,保持技术先进性


典型应用场景
  • 企业级应用开发
  • 微服务架构
  • 云原生应用
  • 批处理系统
  • 响应式编程

Spring Boot

简介

是 Spring 官方推出的一个快速开发框架,用于简化 Spring 应用的搭建和开发过程,即spring快速开发脚手架,可对比vue开发脚手架进行学习。

目标:

  • 快速搭建项目
  • 减少繁琐配置
  • 提供开箱即用的解决方案(依赖管理、配置、内嵌服务器等)

Spring Boot 与 Spring 的关系

Spring 是一个功能强大但配置相对复杂的底层框架;

Spring Boot 是基于 Spring 的快速开发工具,提供自动配置、依赖整合、快速启动等能力。

对比项 Spring Spring Boot
本质 底层开发框架 快速开发框架(工具 + 配置封装)
配置方式 手动配置较多(XML/Java) 自动配置为主,默认约定优于配置
启动方式 通常打包部署到容器 内嵌 Tomcat,main 方法直接运行
目标 灵活,功能全面 简化开发,提高效率

核心特性

  • 自动配置:根据依赖和类路径自动配置项目所需的功能。
  • Starter 起步依赖 :通过 spring-boot-starter-xxx 快速引入一整套所需依赖。
  • 内嵌 Web 服务器:默认集成 Tomcat,无需打包成 war 部署。
  • 统一配置文件 :集中管理配置项(application.ymlapplication.properties)。
  • 快速启动机制 :通过 SpringApplication.run() 启动整个项目。
  • 无缝集成 Spring 生态:Spring Security、Spring Data、Spring Cloud 等可直接整合。
相关推荐
crazyme_622 分钟前
前端自学入门:HTML 基础详解与学习路线指引
前端·学习·html
龙湾开发24 分钟前
轻量级高性能推理引擎MNN 学习笔记 02.MNN主要API
人工智能·笔记·学习·机器学习·mnn
Camellia031129 分钟前
嵌入式学习--江协51单片机day5
嵌入式硬件·学习·51单片机
撸猫79130 分钟前
HttpSession 的运行原理
前端·后端·cookie·httpsession
嘵奇1 小时前
Spring Boot中HTTP连接池的配置与优化实践
spring boot·后端·http
HappyAcmen1 小时前
线代第二章矩阵第八节逆矩阵、解矩阵方程
笔记·学习·线性代数·矩阵
杨德兴1 小时前
3.3 阶数的作用
人工智能·学习
chilling heart1 小时前
API的学习总结(上)
学习
子燕若水1 小时前
Flask 调试的时候进入main函数两次
后端·python·flask
程序员爱钓鱼1 小时前
跳转语句:break、continue、goto -《Go语言实战指南》
开发语言·后端·golang·go1.19