Web安全
基础漏洞
01前端基础【HTML】
02前端基础【CSS】
03后端基础【PHP速通】
04后端基础【PHP面向对象】
05MySQL基础操作
06前后端联动【代码练习】
07SQL注入【1】
07SQL 注入【2】
08SQL注入 Labs
08SQL注入速查表
09XSS
09跨站脚本攻击【XSS】
09XSS Labs
10跨站请求伪造【CSRF】
11服务器端请求伪造【SSRF】
12XML 外部实体注入【XXE】
13代码执行漏洞
14命令执行漏洞
15文件包含漏洞
16文件上传漏洞
17反序列化漏洞
18业务逻辑漏洞
19未授权访问漏洞集合
20跨源资源共享【CORS】
21SSTI模板注入
22并发漏洞
23点击劫持【Clickjacking 】
24请求走私
25路径遍历
26访问控制
27身份验证漏洞
28WebSocket
29Web缓存中毒
30HTTP 主机头攻击
31信息泄露漏洞
32原型污染
33NoSQL注入
API 安全
01web应用程序
02HTTP协议
03API概述
04分类类型
05交换格式
06身份验证
07常见API漏洞
08crAPI靶场
09JWT
10OAuth 2.0身份验证
11GraphQL【1】
11GraphQL【2】
12DVGA靶场
13服务器端参数污染
14API文档
15API Labs
16OAuth Labs
17GraphQL API Labs
18JWT Labs
小程序
小程序抓包
数据库
MySQL
Oracle
MongoDB
Redis
PostgreSQL
SQL server
中间件
Nginx
Apache HTTP Server
IIS
Tomcat
框架
ThinkPHP
Spring
Spring Boot
Django
访问控制
-
+
首页
Spring
 ## 概述 Spring 是一个**开源的 Java 企业级应用开发框架**,由 Rod Johnson 于 2002 年首次提出,2003 年发布 1.0 版本。其核心目标是**简化 Java 企业级开发**,通过 “依赖注入(DI)” 和 “面向切面编程(AOP)” 两大核心思想,解决传统 Java 开发中代码耦合度高、配置繁琐等问题。 Spring 并非替代现有技术,而是通过整合和封装(如 JDBC、Servlet、ORM 等),提供统一的开发模型,降低企业级应用的开发复杂度。经过 20 余年发展,Spring 已从单一框架演变为**庞大的生态系统**,成为 Java 开发的事实标准,被广泛应用于企业级应用、微服务、中间件等场景。 **官网地址**:https://spring.io **官方文档地址**:https://docs.spring.io/spring-framework/docs/current/reference/html/ **GitHub 仓库**:https://github.com/spring-projects/spring-framework ## 历史与版本演进 Spring 的版本迭代反映了 Java 技术栈的发展,核心版本演进如下: - **2003 年**:Spring 1.0 发布,首次提出 “依赖注入(DI)” 和 “面向切面编程(AOP)” 核心思想,通过 XML 配置管理 Bean,简化了 EJB 的复杂开发。 - **2006 年**:Spring 2.0 引入注解驱动开发(如@Component、@Service),支持 XML 与注解混合配置,增强 AOP 功能。 - **2009 年**:Spring 3.0 要求 Java 5+,全面支持注解配置(@Configuration、@Bean),引入 Spring Expression Language(SpEL),支持 RESTful Web 服务开发。 - **2013 年**:Spring 4.0 要求 Java 6+,支持 Java 8 的 Lambda 表达式和 Stream API,增强对 WebSocket、异步处理的支持,引入条件注解(@Conditional)。 - **2017 年**:Spring 5.0 重大升级,要求 Java 8+,支持 Java 9 模块化,引入响应式编程模型(WebFlux),基于 Reactor 库实现非阻塞 IO,同时移除对 XML 配置的部分依赖,强化注解驱动。 - **2022 年**:Spring 6.0 发布,要求 Java 17+,全面迁移到 Jakarta EE 9+(包名从javax改为jakarta),支持 AOT(Ahead-of-Time)编译,优化对 GraalVM 原生镜像的支持,提升启动性能。 **版本支持策略**:每个大版本提供 4 年支持(3 年常规维护 + 1 年安全补丁),例如 Spring 5.x 支持至 2024 年,Spring 6.x 支持至 2026 年。 ## 特点 **控制反转(IOC)与依赖注入(DI)** 核心思想是 “将对象的创建和依赖管理交给框架”,而非手动new对象。通过容器(ApplicationContext)管理 Bean 的生命周期和依赖关系,降低代码耦合度。 **面向切面编程(AOP)** 将日志、事务、安全等横切关注点从业务逻辑中分离,通过切面(Aspect)统一处理,减少重复代码,提高可维护性。 **模块化设计** 框架按功能划分为多个模块(如 Core、Context、AOP、Web、Data 等),开发者可按需引入,避免冗余依赖。 **声明式事务管理** 通过注解(@Transactional)或 XML 配置实现事务管理,无需手动编写try-catch和事务提交 / 回滚代码,简化数据一致性保障。 **无缝集成第三方框架** 兼容主流技术(如 MyBatis、Hibernate、Redis、Quartz 等),提供统一的集成接口,降低技术栈整合成本。 **跨场景适用性** 支持从单体应用到微服务、从同步到响应式编程、从 Web 应用到批处理任务等多种场景,适配不同业务需求。 ## 架构设计 Spring 采用**分层架构**,按功能划分为多个模块,各模块可独立使用,核心模块如下(以 Spring 5.x 为例): ```txt Spring Framework ├─ 核心容器(Core Container) │ ├─ spring-core:IOC核心实现,包含BeanFactory、依赖注入基础类 │ ├─ spring-beans:Bean定义、创建、管理的核心API │ ├─ spring-context:扩展BeanFactory,提供事件、资源管理、国际化等功能 │ ├─ spring-context-support:整合第三方库(如缓存、模板引擎)的支持类 │ └─ spring-expression:SpEL表达式语言,用于运行时查询和操作对象 ├─ AOP与设备支持(AOP & Instrumentation) │ ├─ spring-aop:AOP核心实现,包含切面、通知、切点等API │ ├─ spring-aspects:集成AspectJ框架(增强AOP功能) │ └─ spring-instrument:JVM级别的设备支持,用于类加载增强 ├─ 数据访问/集成(Data Access/Integration) │ ├─ spring-jdbc:JDBC抽象层,简化数据库操作(如JdbcTemplate) │ ├─ spring-tx:事务管理核心(声明式/编程式事务) │ ├─ spring-orm:整合ORM框架(Hibernate、JPA等) │ ├─ spring-oxm:对象-XML映射(如JAXB、Castor) │ └─ spring-jms:Java消息服务(JMS)支持 ├─ Web模块 │ ├─ spring-web:Web开发基础支持(Servlet、过滤器、文件上传等) │ ├─ spring-webmvc:Spring MVC框架(基于Servlet的同步Web开发) │ ├─ spring-websocket:WebSocket协议支持 │ └─ spring-webflux:响应式Web框架(基于Netty的非阻塞IO) └─ 测试模块(Test) └─ spring-test:整合JUnit、Mockito等测试框架,支持Spring组件测试 ``` **核心容器(Core Container)** 是整个框架的基础,其他模块均依赖于此,负责 Bean 的创建、依赖注入和生命周期管理。 ## 核心功能与组件 ### IOC 容器(控制反转) **核心概念**:IOC 容器是 Spring 的 “心脏”,负责管理 Bean 的生命周期(创建、初始化、销毁)和依赖关系,开发者通过配置(注解 / XML)定义 Bean,容器自动实例化并注入依赖。 **核心接口**: - BeanFactory:最基础的 IOC 容器接口,提供 Bean 的获取、创建功能(延迟初始化,适合资源受限场景)。 - ApplicationContext:BeanFactory的子接口,扩展了事件发布、资源加载、国际化等功能(立即初始化,适合大多数企业级应用)。 **依赖注入(DI)方式**: - 构造器注入:通过构造方法传递依赖(推荐,强制依赖关系); - Setter 注入:通过 Setter 方法设置依赖(适合可选依赖); - 字段注入:通过@Autowired直接注入字段(简化代码,但不利于测试)。 ```java @Service public class UserService { private final UserRepository userRepository; // 构造器注入 @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } } @Repository public class UserRepository { ... } ``` ### AOP(面向切面编程) **核心概念**:将日志、事务、安全等 “横切逻辑” 从业务代码中分离,通过 “切面(Aspect)” 统一管理,实现 “关注点分离”。 **核心术语**: - 切面(Aspect):横切逻辑的封装类(如TransactionAspect); - 通知(Advice):切面中的具体逻辑(如@Before、@After、@Around); - 切点(Pointcut):定义通知作用的目标方法(如 “所有service包下的方法”); - 连接点(Joinpoint):程序执行过程中可插入切面的点(如方法调用、异常抛出)。 ```java @Aspect @Component public class TransactionAspect { @Around("execution(* com.example.service.*.*(..))") // 切点:service包下所有方法 public Object manageTransaction(ProceedingJoinPoint joinPoint) throws Throwable { // 前置通知:开启事务 TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { Object result = joinPoint.proceed(); // 执行目标方法 transactionManager.commit(status); // 后置通知:提交事务 return result; } catch (Exception e) { transactionManager.rollback(status); // 异常通知:回滚事务 throw e; } } } ``` ### 事务管理 Spring 提供**声明式事务**和**编程式事务**两种方式,其中声明式事务通过注解或 XML 配置,无需侵入业务代码。 **注解方式**:通过@Transactional注解标记需要事务管理的方法: ```java @Service public class OrderService { @Transactional // 声明式事务:方法执行失败自动回滚 public void createOrder(Order order) { // 业务逻辑:创建订单、扣减库存等 orderRepository.save(order); inventoryService.reduceStock(order.getProductId(), order.getQuantity()); } } ``` ### 事件机制 Spring 提供事件驱动模型,通过ApplicationEvent和ApplicationListener实现组件间解耦: - 定义事件:继承ApplicationEvent; - 发布事件:通过ApplicationContext.publishEvent(); - 监听事件:实现ApplicationListener或使用@EventListener注解。 ### 资源管理 Spring 提供统一的资源访问接口(Resource),简化文件、URL、类路径等资源的加载: ```java Resource resource = new ClassPathResource("config.properties"); InputStream is = resource.getInputStream(); // 加载类路径下的资源 ``` ## 目录结构 Spring 本身是框架,其目录结构指**基于 Spring 开发的项目**(Maven/Gradle)的典型结构,遵循 “约定优于配置”: ```txt 项目根目录/ ├─ src/ │ ├─ main/ │ │ ├─ java/ # 源代码 │ │ │ └─ com/ │ │ │ └─ example/ │ │ │ ├─ config/ # 配置类(@Configuration) │ │ │ │ └─ AppConfig.java │ │ │ ├─ controller/ # 控制器(如Spring MVC的@Controller) │ │ │ │ └─ UserController.java │ │ │ ├─ service/ # 服务层(@Service) │ │ │ │ └─ UserService.java │ │ │ ├─ repository/ # 数据访问层(@Repository) │ │ │ │ └─ UserRepository.java │ │ │ └─ model/ # 数据模型(实体类) │ │ │ └─ User.java │ │ └─ resources/ # 资源文件 │ │ ├─ application.xml # XML配置文件(可选) │ │ └─ db.properties # 数据库配置等 │ └─ test/ # 测试代码 │ └─ java/ │ └─ com/ │ └─ example/ │ └─ service/ │ └─ UserServiceTest.java └─ pom.xml # Maven依赖(引入spring-context等核心模块) ``` ## 入口文件(容器启动类) Spring 应用的 “入口” 是**IOC 容器的启动类**,负责初始化ApplicationContext并加载配置。 ### 注解配置启动 通过@Configuration和@ComponentScan定义配置,使用AnnotationConfigApplicationContext启动容器: ```java // 配置类 @Configuration @ComponentScan("com.example") // 扫描组件 public class AppConfig { @Bean // 定义Bean public UserService userService() { return new UserService(userRepository()); } @Bean public UserRepository userRepository() { return new UserRepository(); } } // 启动类 public class Main { public static void main(String[] args) { // 初始化容器并加载配置 ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); // 从容器获取Bean UserService userService = context.getBean(UserService.class); userService.doSomething(); } } ``` ### XML 配置启动 通过 XML 文件定义 Bean,使用ClassPathXmlApplicationContext启动容器: ```java <!-- resources/application.xml --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userRepository" class="com.example.repository.UserRepository"/> <bean id="userService" class="com.example.service.UserService"> <constructor-arg ref="userRepository"/> <!-- 依赖注入 --> </bean> </beans> ``` ## 适用场景 Spring 框架适用于几乎所有 Java 后端开发场景,尤其适合: **企业级应用开发**:如 ERP、CRM、OA 等系统,通过 IOC 和 AOP 降低代码耦合,简化事务、安全等核心功能开发。 **微服务架构**:作为 Spring Cloud 的基础,支持构建松耦合的微服务(如通过 Spring Boot 快速开发微服务实例)。 **Web 应用开发**:通过 Spring MVC(同步)或 WebFlux(响应式)开发 RESTful API、网站后台等。 **数据访问层开发**:通过 Spring JDBC、Spring Data 简化数据库操作,整合 MyBatis、JPA 等 ORM 框架。 **中间件与工具开发**:如消息队列客户端、缓存组件等,利用 Spring 的扩展性和集成能力提升开发效率。 ## 优劣势 ### 优势 **降低耦合度**:IOC 容器管理依赖,AOP 分离横切关注点,使代码更易维护和扩展。 **简化开发**:封装了复杂的企业级功能(如事务、安全),提供统一接口,减少重复代码。 **生态完善**:与 Spring Boot、Spring Cloud、Spring Security 等生态组件无缝集成,形成完整技术栈。 **灵活性高**:支持多种配置方式(注解、XML、JavaConfig),可按需扩展(如自定义 BeanPostProcessor)。 **社区活跃**:作为 Java 主流框架,官方文档完善,问题解决方案丰富,版本迭代及时。 ### 劣势 **学习曲线陡峭**:核心概念(IOC、AOP、事务管理等)抽象度高,初学者需理解其原理才能灵活使用。 **配置复杂度**:传统 XML 配置繁琐(现代版本通过注解简化,但复杂项目仍需大量配置)。 **过度设计风险**:简单项目可能因引入 Spring 而增加不必要的复杂度。 **性能开销**:IOC 容器和 AOP 代理会带来一定的性能损耗(通常可忽略,高并发场景需优化) # Spring 生态系统 Spring 生态系统是一个以 **Spring Framework** 为核心,涵盖开发、部署、运维全流程的庞大技术体系,包含数十个开源项目,旨在为 Java(及 JVM 语言)开发提供完整解决方案。 Spring 生态以 **Spring Framework** 为基础,向外延伸出四大方向: - **开发简化层**:简化应用初始化与配置(如 Spring Boot); - **业务能力层**:提供安全、数据、消息等核心功能(如 Spring Security、Spring Data); - **架构支持层**:支持微服务、响应式等架构模式(如 Spring Cloud、Spring WebFlux); - **工具与集成层**:提供测试、部署、第三方集成等工具(如 Spring Test、Spring Integration)。 ### 基础核心:Spring Framework **定位**:整个生态的 “基石”,提供 IOC(控制反转)、AOP(面向切面编程)、事务管理等核心功能。 **核心模块**:Core(IOC 容器)、AOP(切面编程)、Context(上下文管理)、Web(Web 开发基础)、Data Access(数据访问支持)等。 **作用**:所有其他 Spring 项目均基于其核心机制构建,提供统一的编程模型。 ### 开发简化:Spring Boot **定位**:“Spring 应用的快速启动器”,简化 Spring 应用的初始化、配置与部署。 核心功能: - 自动配置(根据依赖自动配置组件,减少 XML / 代码配置); - Starter 依赖(预定义场景化依赖包,如spring-boot-starter-web); - 嵌入式服务器(内置 Tomcat/Jetty,支持java -jar直接运行); - 生产就绪特性(监控、健康检查、外部化配置)。 **关系**:基于 Spring Framework,是构建微服务和快速开发的首选工具。 ### 微服务架构:Spring Cloud **定位**:微服务架构的 “工具集”,基于 Spring Boot 实现分布式系统的核心功能。 核心组件: - **服务注册与发现**:Eureka/Consul(服务注册表,实现服务自动发现); - **配置中心**:Spring Cloud Config(集中管理多环境配置,动态刷新); - **API 网关**:Spring Cloud Gateway(路由转发、负载均衡、限流熔断); - **熔断与降级**:Resilience4j/Sentinel(防止服务雪崩,保障系统稳定性); - **分布式追踪**:Spring Cloud Sleuth + Zipkin(追踪请求链路,排查分布式问题)。 **作用**:解决微服务中的服务治理、配置管理、容错等核心问题,使分布式系统开发 “像单体应用一样简单”。 ### 安全认证:Spring Security **定位**:企业级安全框架,提供认证(Authentication)与授权(Authorization)功能。 核心功能: - 用户认证(支持用户名密码、OAuth2、JWT、LDAP 等多种认证方式); - 权限控制(基于角色 / 资源的访问控制,如@PreAuthorize("hasRole('ADMIN')")); - 防护机制(防 CSRF、XSS、会话固定攻击等); - 集成支持(与 Spring MVC/WebFlux、Spring Cloud 等无缝集成)。 **典型场景**:后台管理系统的登录验证、API 接口的权限控制、第三方登录(如微信 / QQ 登录)。 ### 数据访问:Spring Data **定位**:简化数据访问层开发,统一关系型数据库、NoSQL 的操作接口。 核心子项目: - **Spring Data JPA**:基于 JPA 规范,通过接口定义自动生成 SQL(如findByUsername); - **Spring Data MongoDB**:MongoDB 文档数据库的统一操作接口; - **Spring Data Redis**:Redis 缓存的简化操作(支持 String、Hash、List 等数据结构); - **Spring Data Elasticsearch**:Elasticsearch 搜索引擎的集成支持。 **核心特性**:通过 “Repository 接口” 抽象数据操作,开发者无需编写 SQL(或少量编写),即可实现 CRUD、分页、排序等功能。 ### 响应式编程:Spring WebFlux **定位**:响应式 Web 框架,基于 Reactor 库实现非阻塞 IO,适合高并发场景。 核心特点: - 非阻塞模型(一个线程处理多个请求,提升吞吐量); - 函数式编程支持(通过RouterFunction定义路由,替代传统@Controller); - 背压(Backpressure)支持(消费者可控制生产者的数据流速度,避免内存溢出)。 **对比 Spring MVC**:MVC 基于 Servlet 的同步阻塞模型,适合中等并发;WebFlux 基于 Netty 的异步非阻塞模型,适合高并发(如直播、IoT 数据采集)。 ### 批处理与任务 **Spring Batch**: - 定位:企业级批处理框架,处理大量数据的批量操作(如数据同步、报表生成、日志分析)。 - 核心功能:分区处理(大任务拆分)、事务管理、重试机制、监控与统计。 **Spring Scheduler**: - 定位:轻量级定时任务框架,支持基于 Cron 表达式的任务调度(如 “每天凌晨 2 点执行备份”)。 - 集成方式:通过@Scheduled注解快速定义定时任务,无需依赖 Quartz 等重型框架。 ### 集成与消息 **Spring Integration**: - 定位:企业集成模式(EIP)的实现,简化系统间通信(如文件、HTTP、消息队列的集成)。 - 核心功能:通过 “通道(Channel)”“适配器(Adapter)”“路由器(Router)” 等组件,实现系统解耦。 **Spring AMQP**: - 定位:基于 AMQP 协议(如 RabbitMQ)的消息通信框架,简化消息生产者 / 消费者开发。 ### 测试:Spring Test **定位**:Spring 应用的测试支持框架,整合 JUnit、Mockito 等测试工具。 **核心功能**: - 模拟 IOC 容器(@SpringBootTest),无需启动实际服务即可测试组件; - 模拟 Web 环境(@WebMvcTest),测试 Controller 接口; - 事务回滚(@Transactional),确保测试不污染数据库。 ### 其他项目 **Spring Session**:分布式会话管理,支持将会话存储在 Redis、MongoDB 等,解决集群环境下的会话共享问题。 **Spring Actuator**:应用监控工具,提供健康检查、性能指标、日志配置等端点(通常与 Spring Boot 结合使用)。 **Spring Cloud Stream**:消息驱动的微服务框架,统一 Kafka、RabbitMQ 等消息中间件的操作接口。
毛林
2025年9月12日 20:31
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码