# SpringBeanField **Repository Path**: he-weigang/spring-bean-field ## Basic Information - **Project Name**: SpringBeanField - **Description**: 解释Spring的Bean作用域的代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-30 - **Last Updated**: 2025-07-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Bean作用域演示项目 本项目演示了Spring框架中不同Bean作用域的使用方法和行为特点。 ## 🎯 项目概述 Spring支持多种Bean作用域,每种作用域决定了Bean的生命周期和实例化策略: ### 📋 支持的作用域 1. **Singleton(单例)** - 默认作用域,整个容器中只创建一个实例 2. **Prototype(原型)** - 每次请求都创建新的实例 3. **Request(请求)** - Web环境中,每个HTTP请求创建一个实例 4. **Session(会话)** - Web环境中,每个HTTP会话创建一个实例 5. **Application(应用)** - Web环境中,整个Web应用创建一个实例 6. **自定义作用域** - ThreadLocal作用域,每个线程创建一个实例 ## 🏗️ 项目结构 ``` SpringBeanField/ ├── src/main/java/org/example/ │ ├── beans/ # 不同作用域的Bean示例 │ │ ├── SingletonBean.java │ │ ├── PrototypeBean.java │ │ ├── RequestScopeBean.java │ │ ├── SessionScopeBean.java │ │ ├── ApplicationScopeBean.java │ │ └── ThreadScopeBean.java │ ├── config/ │ │ └── AppConfig.java # Spring配置类 │ ├── controller/ │ │ └── WebScopeController.java # Web作用域演示控制器 │ ├── scope/ │ │ └── ThreadLocalScope.java # 自定义ThreadLocal作用域 │ ├── service/ │ │ └── ScopeTestService.java # 作用域测试服务 │ └── App.java # 主应用程序 ├── src/test/java/org/example/ │ └── ScopeTest.java # 单元测试 └── run-ide.bat # IDE版本运行脚本 ``` ## 🚀 运行演示 ### 📋 环境要求 在运行项目之前,请确保已安装: - ☕ **Java 11+** - [下载地址](https://adoptium.net/) - 🔧 **Apache Maven** - [下载地址](https://maven.apache.org/download.cgi)(可选,IDE已包含依赖) ### 🖱️ 快速运行(Windows) #### 推荐方式:使用IDE版本脚本 双击 `run-ide.bat` 即可运行项目。 **特性:** - ✅ 已解决中文乱码问题(使用UTF-8编码) - ✅ 不依赖系统中的Maven安装 - ✅ 使用IDE编译后的类文件和Maven本地仓库的依赖 - ✅ 提供详细的错误信息和故障排除建议 #### 中文乱码解决方案 本项目已解决Windows命令行中文乱码问题: - 所有bat文件开头添加了 `chcp 65001 >nul` 命令 - 设置控制台为UTF-8编码页 - 确保中文字符正确显示 ### 💻 命令行运行 #### 1. 基础作用域演示(Singleton & Prototype) ```bash mvn compile exec:java -Dexec.mainClass="org.example.App" ``` 或者在有Maven的环境下: ```bash mvn clean compile mvn exec:java -Dexec.mainClass="org.example.App" ``` 这将演示: - ✅ Singleton作用域:多次获取同一个实例 - ✅ Prototype作用域:每次获取创建新实例 - ✅ ThreadLocal作用域:每个线程一个实例 - ✅ Bean容器信息展示 #### 2. 运行单元测试 ```bash mvn test ``` 测试内容包括: - ✅ Singleton作用域验证 - ✅ Prototype作用域验证 - ✅ Bean数量统计 ### 3. Web作用域演示 Web作用域(Request、Session、Application)需要在Web容器中运行。可以: 1. 将项目部署到Tomcat等Web容器 2. 访问以下URL: - `/scope/test` - 完整的Web作用域演示 - `/scope/request` - Request作用域测试 - `/scope/session` - Session作用域测试 ## 🔧 故障排除 ### 常见问题及解决方案 #### 1. 运行bat文件时闪退 **原因:** classpath配置问题或依赖缺失 **解决方案:** - 确保在IDE中已编译项目(存在 `target/classes` 目录) - 确保Maven依赖已下载(检查 `C:\Users\Administrator\.m2\repository` 目录) - 使用 `run-ide.bat` 而不是其他脚本 #### 2. 中文乱码问题 **原因:** Windows控制台编码问题 **解决方案:** - 项目已修复:所有bat文件都包含 `chcp 65001 >nul` 命令 - 如果仍有问题,请检查IDE的文件编码设置 #### 3. NoClassDefFoundError: javax/servlet/http/HttpServletRequest **原因:** Servlet API依赖scope设置为provided **解决方案:** - 项目已修复:在 `pom.xml` 中移除了servlet-api的provided scope - 重新编译项目即可 #### 4. 找不到Maven命令 **解决方案:** - 使用 `run-ide.bat`(不依赖Maven) - 或在IDE中直接运行主类 `org.example.App` ## 📖 代码说明 ### 1. Singleton作用域(默认) ```java @Component // 默认是Singleton作用域 public class SingletonBean { // 整个容器中只有一个实例 } ``` ### 2. Prototype作用域 ```java @Component @Scope("prototype") public class PrototypeBean { // 每次请求都创建新实例 } ``` ### 3. Web作用域 ```java @Component @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) public class RequestScopeBean { // 每个HTTP请求创建一个实例 } ``` **注意**:Web作用域需要使用`proxyMode`来解决依赖注入问题。 ### 4. 自定义作用域 ```java @Component @Scope("thread") public class ThreadScopeBean { // 每个线程创建一个实例 } ``` 自定义作用域需要: 1. 实现`Scope`接口 2. 在配置类中注册作用域 ## 🔍 作用域对比 | 作用域 | 实例数量 | 使用场景 | 环境要求 | proxyMode | |--------|----------|----------|----------|-----------| | Singleton | 1个/容器 | 无状态服务、工具类 | 任何 | 不需要 | | Prototype | 每次请求1个 | 有状态对象、命令对象 | 任何 | 不需要 | | Request | 1个/HTTP请求 | 请求相关数据 | Web | 必须 | | Session | 1个/HTTP会话 | 用户会话数据 | Web | 必须 | | Application | 1个/Web应用 | 全局共享数据 | Web | 必须 | | Thread | 1个/线程 | 线程安全需求 | 任何 | 不需要 | ## ⚠️ 注意事项 1. **Singleton Bean线程安全**:默认情况下Singleton Bean不是线程安全的 2. **Prototype Bean生命周期**:Spring不管理Prototype Bean的完整生命周期 3. **Web作用域代理**:Web作用域Bean需要使用代理模式注入 4. **自定义作用域**:需要正确实现Scope接口的所有方法 5. **依赖配置**:Web作用域Bean需要servlet-api依赖,已修复scope配置问题 ## 🛠️ 技术栈 - **Spring Framework 5.3.21** - 核心框架 - **Spring Web** - Web作用域支持 - **Spring Test** - 单元测试支持 - **JUnit 4** - 测试框架 - **Maven** - 构建工具 - **Java 11** - 开发语言 - **Servlet API 4.0.1** - Web环境支持 ## 📝 学习要点 通过本项目,您将学会: 1. 🎯 **理解不同作用域的特点和使用场景** 2. 🏗️ **掌握Spring Bean的配置方法** 3. 🔧 **学会自定义作用域的实现** 4. 🌐 **了解Web环境下的作用域特性** 5. ✅ **掌握单元测试的编写方法** 6. 🛠️ **学会解决常见的配置和依赖问题** ## 🤝 贡献 欢迎提交Issue和Pull Request来完善这个演示项目!