# Spring-Py
一个类似Spring Framework的Python依赖注入框架,提供了现代化的IoC容器和组件管理功能。
## 特性
- 🚀 **类Spring注解** - 支持 `@Component`, `@Configuration`, `@Bean`, `@Autowired` 等注解
- 🔧 **依赖注入** - 自动化的组件依赖管理和注入
- 📦 **组件扫描** - 自动发现并注册标记的组件
- 🌐 **全局上下文** - 单例应用上下文,无需手动传递
- 🛠️ **Bean工厂** - 支持通过 `@Bean` 方法创建复杂对象
- 📝 **类型安全** - 完整的类型注解支持
- 🏗️ **项目脚手架** - 内置CLI工具快速生成项目模板
## 安装
```bash
pip install spring-py-core
```
## 项目地址
https://github.com/mahoushoujyo-eee/spring-py
## 快速开始
### 1. 基本组件定义
```python
from spring_py import Component, Autowired
@Component
class UserService:
def get_user(self, user_id: int):
return {"id": user_id, "name": "Alice"}
@Component
class OrderService:
user_service: UserService = Autowired()
def create_order(self, user_id: int):
user = self.user_service.get_user(user_id)
return {"order_id": 123, "user": user}
```
### 2. 应用启动
```python
from spring_py import SpringBootApplication, get_bean
@SpringBootApplication()
class Application:
pass
def main():
# 启动应用上下文
app = Application()
context = app.run()
# 获取并使用服务
order_service = get_bean(OrderService)
order = order_service.create_order(1)
print(order)
if __name__ == "__main__":
main()
```
### 3. 运行结果
```
🚀 Starting Spring-Py application...
📦 Scanning packages: ['/path/to/your/app']
--- 扫描组件 ---
Scanned 2 components:
- UserService (main)
- OrderService (main)
✓ GlobalContext initialized with 2 components
✅ Application started successfully!
{'order_id': 123, 'user': {'id': 1, 'name': 'Alice'}}
```
## 核心概念
### 组件注解
#### @Component
标记一个类为Spring组件,会被自动扫描和注册:
```python
@Component
class MyService:
def do_something(self):
return "Hello from MyService"
```
#### @Service
`@Component` 的语义化别名,用于服务层:
```python
from spring_py import Service
@Service
class BusinessService:
def process_business_logic(self):
return "Processing..."
```
#### @Configuration
标记配置类,通常包含 `@Bean` 方法:
```python
from spring_py import Configuration, Bean
@Configuration
class AppConfig:
@Bean
def database_connection(self):
return DatabaseConnection("localhost:5432")
```
### 依赖注入
#### @Autowired
自动注入依赖的组件:
```python
@Component
class UserController:
user_service: UserService = Autowired()
email_service: EmailService = Autowired()
def register_user(self, username: str):
user = self.user_service.create_user(username)
self.email_service.send_welcome_email(user)
return user
```
#### 按类型注入
```python
# 直接按类型获取
user_service = get_bean(UserService)
```
#### 按名称注入
```python
# 按组件名称获取(类名小写)
user_service = get_bean("userservice")
```
### Bean工厂方法
使用 `@Bean` 注解创建复杂对象:
```python
@Configuration
class DatabaseConfig:
@Bean
def database_connection(self):
return DatabaseConnection(
host="localhost",
port=5432,
database="myapp"
)
@Bean
def redis_client(self):
return Redis(host="localhost", port=6379)
# 使用Bean
@Component
class DataService:
db: DatabaseConnection = Autowired()
cache: Redis = Autowired()
```
### 全局上下文
无需手动传递ApplicationContext,在任何地方都可以获取Bean:
```python
from spring_py import get_bean
def some_utility_function():
# 在任何地方都可以获取Bean
user_service = get_bean(UserService)
return user_service.get_user_count()
```
## Web应用集成
Spring-Py与FastAPI完美集成:
```python
from spring_py import Component, Autowired, SpringBootApplication, get_bean
from fastapi import FastAPI, APIRouter
import uvicorn
@Component
class UserService:
def get_all_users(self):
return [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
@Component
class UserController:
user_service: UserService = Autowired()
def setup_routes(self) -> APIRouter:
router = APIRouter(prefix="/api/users")
@router.get("/")
async def get_users():
return self.user_service.get_all_users()
return router
@SpringBootApplication()
class WebApplication:
def create_app(self) -> FastAPI:
app = FastAPI(title="Spring-Py Web App")
# 注册路由
controller = get_bean(UserController)
app.include_router(controller.setup_routes())
return app
def main():
app = WebApplication()
context = app.run()
fastapi_app = app.create_app()
uvicorn.run(fastapi_app, host="0.0.0.0", port=8000)
if __name__ == "__main__":
main()
```
## CLI工具
Spring-Py提供了项目脚手架工具:
### 创建新项目
```bash
# 创建Web应用项目
spring-py create my-web-app
# 查看可用模板
spring-py templates
# 查看版本
spring-py version
```
### 生成的项目结构
```
my-web-app/
├── src/
│ ├── main/
│ │ ├── application.py # 应用主入口
│ │ ├── controller/ # 控制器层
│ │ ├── service/ # 服务层
│ │ ├── model/ # 数据模型
│ │ └── param/ # 参数定义
│ └── test/ # 测试代码
├── pyproject.toml # 项目配置
├── README.md # 项目文档
├── .gitignore # Git忽略文件
└── .env.example # 环境变量示例
```
### 运行生成的项目
```bash
cd my-web-app
pip install -e .
python src/main/application.py
```
项目会启动一个FastAPI服务器,包含:
- **API文档**: http://localhost:8000/docs
- **健康检查**: http://localhost:8000/health
- **用户API**: http://localhost:8000/api/users/
## 高级用法
### 条件Bean注册
```python
@Configuration
class ConditionalConfig:
@Bean
def development_service(self):
if os.getenv("ENV") == "dev":
return DevelopmentService()
return ProductionService()
```
### Bean作用域
```python
@Component
class SingletonService:
"""默认单例作用域"""
pass
# 获取的总是同一个实例
service1 = get_bean(SingletonService)
service2 = get_bean(SingletonService)
assert service1 is service2 # True
```
### 多环境配置
```python
@Configuration
class DatabaseConfig:
@Bean
def database_url(self):
env = os.getenv("ENV", "dev")
if env == "prod":
return "postgresql://prod-server:5432/myapp"
else:
return "sqlite:///./dev.db"
```
## 最佳实践
### 1. 项目结构
```
your-app/
├── src/main/
│ ├── controller/ # Web控制器
│ ├── service/ # 业务逻辑服务
│ ├── repository/ # 数据访问层
│ ├── model/ # 数据模型
│ ├── config/ # 配置类
│ └── application.py # 应用入口
```
### 2. 分层架构
```python
# 控制器层
@Component
class UserController:
user_service: UserService = Autowired()
# 服务层
@Service
class UserService:
user_repository: UserRepository = Autowired()
# 数据访问层
@Component
class UserRepository:
database: Database = Autowired()
```
### 3. 配置管理
```python
@Configuration
class AppConfiguration:
@Bean
def app_settings(self):
return AppSettings(
database_url=os.getenv("DATABASE_URL"),
redis_url=os.getenv("REDIS_URL"),
secret_key=os.getenv("SECRET_KEY")
)
```
## API参考
### 装饰器
- `@Component` - 标记组件类
- `@Service` - 标记服务类(@Component别名)
- `@Configuration` - 标记配置类
- `@Bean` - 标记Bean工厂方法
- `@Autowired()` - 标记自动注入字段
- `@SpringBootApplication()` - 标记应用主类
### 函数
- `get_bean(cls_or_name)` - 获取Bean实例
- `get_context()` - 获取应用上下文
- `initialize_context(packages)` - 初始化上下文
- `is_context_initialized()` - 检查上下文是否已初始化
### 类
- `ApplicationContext` - 应用上下文
- `Container` - IoC容器
- `ComponentScanner` - 组件扫描器
## 示例项目
查看 [examples](examples/) 目录中的完整示例:
- [基础Web应用](examples/web-app/) - FastAPI + Spring-Py
- [微服务示例](examples/microservice/) - 多服务架构
- [数据库集成](examples/database/) - SQLAlchemy集成
## 开发
### 环境设置
```bash
git clone https://github.com/spring-py/spring-py.git
cd spring-py
uv sync
```
### 运行测试
```bash
uv run pytest tests/
```
### 构建
```bash
uv build
```
## 贡献
欢迎贡献代码!请查看 [CONTRIBUTING.md](CONTRIBUTING.md) 了解详细信息。
## 许可证
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。
## 更新日志
### v0.1.0
- ✅ 基本的IoC容器功能
- ✅ 组件扫描和注册
- ✅ 依赖注入支持
- ✅ @Bean工厂方法
- ✅ 全局上下文管理
- ✅ CLI项目生成工具
- ✅ FastAPI集成支持
### v0.1.3
- ✅ 修复部分因名称导致的问题
### v0.1.4
- ✅ 完善启动模板,增强与fastapi的整合
## 社区
- **GitHub**: https://github.com/spring-py/spring-py
- **文档**: https://spring-py.readthedocs.io
- **讨论**: https://github.com/spring-py/spring-py/discussions
- **问题反馈**: https://github.com/spring-py/spring-py/issues
---
**Spring-Py** - 让Python开发像Spring一样简单! 🚀
Raw data
{
"_id": null,
"home_page": null,
"name": "spring-py-core",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.11",
"maintainer_email": null,
"keywords": "dependency-injection, framework, ioc, spring",
"author": null,
"author_email": "eee <eee1653545106@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/b5/b6/045ef1a05435b028cd793aaadc88fd8dac23ec7f7a35699af7c09493d63a/spring_py_core-0.1.5.tar.gz",
"platform": null,
"description": "# Spring-Py\n\n\u4e00\u4e2a\u7c7b\u4f3cSpring Framework\u7684Python\u4f9d\u8d56\u6ce8\u5165\u6846\u67b6\uff0c\u63d0\u4f9b\u4e86\u73b0\u4ee3\u5316\u7684IoC\u5bb9\u5668\u548c\u7ec4\u4ef6\u7ba1\u7406\u529f\u80fd\u3002\n\n## \u7279\u6027\n\n- \ud83d\ude80 **\u7c7bSpring\u6ce8\u89e3** - \u652f\u6301 `@Component`, `@Configuration`, `@Bean`, `@Autowired` \u7b49\u6ce8\u89e3\n- \ud83d\udd27 **\u4f9d\u8d56\u6ce8\u5165** - \u81ea\u52a8\u5316\u7684\u7ec4\u4ef6\u4f9d\u8d56\u7ba1\u7406\u548c\u6ce8\u5165\n- \ud83d\udce6 **\u7ec4\u4ef6\u626b\u63cf** - \u81ea\u52a8\u53d1\u73b0\u5e76\u6ce8\u518c\u6807\u8bb0\u7684\u7ec4\u4ef6\n- \ud83c\udf10 **\u5168\u5c40\u4e0a\u4e0b\u6587** - \u5355\u4f8b\u5e94\u7528\u4e0a\u4e0b\u6587\uff0c\u65e0\u9700\u624b\u52a8\u4f20\u9012\n- \ud83d\udee0\ufe0f **Bean\u5de5\u5382** - \u652f\u6301\u901a\u8fc7 `@Bean` \u65b9\u6cd5\u521b\u5efa\u590d\u6742\u5bf9\u8c61\n- \ud83d\udcdd **\u7c7b\u578b\u5b89\u5168** - \u5b8c\u6574\u7684\u7c7b\u578b\u6ce8\u89e3\u652f\u6301\n- \ud83c\udfd7\ufe0f **\u9879\u76ee\u811a\u624b\u67b6** - \u5185\u7f6eCLI\u5de5\u5177\u5feb\u901f\u751f\u6210\u9879\u76ee\u6a21\u677f\n\n## \u5b89\u88c5\n\n```bash\npip install spring-py-core\n```\n\n## \u9879\u76ee\u5730\u5740\nhttps://github.com/mahoushoujyo-eee/spring-py\n\n## \u5feb\u901f\u5f00\u59cb\n\n### 1. \u57fa\u672c\u7ec4\u4ef6\u5b9a\u4e49\n\n```python\nfrom spring_py import Component, Autowired\n\n@Component\nclass UserService:\n def get_user(self, user_id: int):\n return {\"id\": user_id, \"name\": \"Alice\"}\n\n@Component\nclass OrderService:\n user_service: UserService = Autowired()\n \n def create_order(self, user_id: int):\n user = self.user_service.get_user(user_id)\n return {\"order_id\": 123, \"user\": user}\n```\n\n### 2. \u5e94\u7528\u542f\u52a8\n\n```python\nfrom spring_py import SpringBootApplication, get_bean\n\n@SpringBootApplication()\nclass Application:\n pass\n\ndef main():\n # \u542f\u52a8\u5e94\u7528\u4e0a\u4e0b\u6587\n app = Application()\n context = app.run()\n \n # \u83b7\u53d6\u5e76\u4f7f\u7528\u670d\u52a1\n order_service = get_bean(OrderService)\n order = order_service.create_order(1)\n print(order)\n\nif __name__ == \"__main__\":\n main()\n```\n\n### 3. \u8fd0\u884c\u7ed3\u679c\n\n```\n\ud83d\ude80 Starting Spring-Py application...\n\ud83d\udce6 Scanning packages: ['/path/to/your/app']\n--- \u626b\u63cf\u7ec4\u4ef6 ---\nScanned 2 components:\n - UserService (main)\n - OrderService (main)\n\u2713 GlobalContext initialized with 2 components\n\u2705 Application started successfully!\n\n{'order_id': 123, 'user': {'id': 1, 'name': 'Alice'}}\n```\n\n## \u6838\u5fc3\u6982\u5ff5\n\n### \u7ec4\u4ef6\u6ce8\u89e3\n\n#### @Component\n\u6807\u8bb0\u4e00\u4e2a\u7c7b\u4e3aSpring\u7ec4\u4ef6\uff0c\u4f1a\u88ab\u81ea\u52a8\u626b\u63cf\u548c\u6ce8\u518c\uff1a\n\n```python\n@Component\nclass MyService:\n def do_something(self):\n return \"Hello from MyService\"\n```\n\n#### @Service\n`@Component` \u7684\u8bed\u4e49\u5316\u522b\u540d\uff0c\u7528\u4e8e\u670d\u52a1\u5c42\uff1a\n\n```python\nfrom spring_py import Service\n\n@Service\nclass BusinessService:\n def process_business_logic(self):\n return \"Processing...\"\n```\n\n#### @Configuration\n\u6807\u8bb0\u914d\u7f6e\u7c7b\uff0c\u901a\u5e38\u5305\u542b `@Bean` \u65b9\u6cd5\uff1a\n\n```python\nfrom spring_py import Configuration, Bean\n\n@Configuration\nclass AppConfig:\n @Bean\n def database_connection(self):\n return DatabaseConnection(\"localhost:5432\")\n```\n\n### \u4f9d\u8d56\u6ce8\u5165\n\n#### @Autowired\n\u81ea\u52a8\u6ce8\u5165\u4f9d\u8d56\u7684\u7ec4\u4ef6\uff1a\n\n```python\n@Component\nclass UserController:\n user_service: UserService = Autowired()\n email_service: EmailService = Autowired()\n \n def register_user(self, username: str):\n user = self.user_service.create_user(username)\n self.email_service.send_welcome_email(user)\n return user\n```\n\n#### \u6309\u7c7b\u578b\u6ce8\u5165\n\n```python\n# \u76f4\u63a5\u6309\u7c7b\u578b\u83b7\u53d6\nuser_service = get_bean(UserService)\n```\n\n#### \u6309\u540d\u79f0\u6ce8\u5165\n\n```python\n# \u6309\u7ec4\u4ef6\u540d\u79f0\u83b7\u53d6\uff08\u7c7b\u540d\u5c0f\u5199\uff09\nuser_service = get_bean(\"userservice\")\n```\n\n### Bean\u5de5\u5382\u65b9\u6cd5\n\n\u4f7f\u7528 `@Bean` \u6ce8\u89e3\u521b\u5efa\u590d\u6742\u5bf9\u8c61\uff1a\n\n```python\n@Configuration\nclass DatabaseConfig:\n \n @Bean\n def database_connection(self):\n return DatabaseConnection(\n host=\"localhost\",\n port=5432,\n database=\"myapp\"\n )\n \n @Bean\n def redis_client(self):\n return Redis(host=\"localhost\", port=6379)\n\n# \u4f7f\u7528Bean\n@Component\nclass DataService:\n db: DatabaseConnection = Autowired()\n cache: Redis = Autowired()\n```\n\n### \u5168\u5c40\u4e0a\u4e0b\u6587\n\n\u65e0\u9700\u624b\u52a8\u4f20\u9012ApplicationContext\uff0c\u5728\u4efb\u4f55\u5730\u65b9\u90fd\u53ef\u4ee5\u83b7\u53d6Bean\uff1a\n\n```python\nfrom spring_py import get_bean\n\ndef some_utility_function():\n # \u5728\u4efb\u4f55\u5730\u65b9\u90fd\u53ef\u4ee5\u83b7\u53d6Bean\n user_service = get_bean(UserService)\n return user_service.get_user_count()\n```\n\n## Web\u5e94\u7528\u96c6\u6210\n\nSpring-Py\u4e0eFastAPI\u5b8c\u7f8e\u96c6\u6210\uff1a\n\n```python\nfrom spring_py import Component, Autowired, SpringBootApplication, get_bean\nfrom fastapi import FastAPI, APIRouter\nimport uvicorn\n\n@Component\nclass UserService:\n def get_all_users(self):\n return [{\"id\": 1, \"name\": \"Alice\"}, {\"id\": 2, \"name\": \"Bob\"}]\n\n@Component\nclass UserController:\n user_service: UserService = Autowired()\n \n def setup_routes(self) -> APIRouter:\n router = APIRouter(prefix=\"/api/users\")\n \n @router.get(\"/\")\n async def get_users():\n return self.user_service.get_all_users()\n \n return router\n\n@SpringBootApplication()\nclass WebApplication:\n def create_app(self) -> FastAPI:\n app = FastAPI(title=\"Spring-Py Web App\")\n \n # \u6ce8\u518c\u8def\u7531\n controller = get_bean(UserController)\n app.include_router(controller.setup_routes())\n \n return app\n\ndef main():\n app = WebApplication()\n context = app.run()\n \n fastapi_app = app.create_app()\n uvicorn.run(fastapi_app, host=\"0.0.0.0\", port=8000)\n\nif __name__ == \"__main__\":\n main()\n```\n\n## CLI\u5de5\u5177\n\nSpring-Py\u63d0\u4f9b\u4e86\u9879\u76ee\u811a\u624b\u67b6\u5de5\u5177\uff1a\n\n### \u521b\u5efa\u65b0\u9879\u76ee\n\n```bash\n# \u521b\u5efaWeb\u5e94\u7528\u9879\u76ee\nspring-py create my-web-app\n\n# \u67e5\u770b\u53ef\u7528\u6a21\u677f\nspring-py templates\n\n# \u67e5\u770b\u7248\u672c\nspring-py version\n```\n\n### \u751f\u6210\u7684\u9879\u76ee\u7ed3\u6784\n\n```\nmy-web-app/\n\u251c\u2500\u2500 src/\n\u2502 \u251c\u2500\u2500 main/\n\u2502 \u2502 \u251c\u2500\u2500 application.py # \u5e94\u7528\u4e3b\u5165\u53e3\n\u2502 \u2502 \u251c\u2500\u2500 controller/ # \u63a7\u5236\u5668\u5c42\n\u2502 \u2502 \u251c\u2500\u2500 service/ # \u670d\u52a1\u5c42\n\u2502 \u2502 \u251c\u2500\u2500 model/ # \u6570\u636e\u6a21\u578b\n\u2502 \u2502 \u2514\u2500\u2500 param/ # \u53c2\u6570\u5b9a\u4e49\n\u2502 \u2514\u2500\u2500 test/ # \u6d4b\u8bd5\u4ee3\u7801\n\u251c\u2500\u2500 pyproject.toml # \u9879\u76ee\u914d\u7f6e\n\u251c\u2500\u2500 README.md # \u9879\u76ee\u6587\u6863\n\u251c\u2500\u2500 .gitignore # Git\u5ffd\u7565\u6587\u4ef6\n\u2514\u2500\u2500 .env.example # \u73af\u5883\u53d8\u91cf\u793a\u4f8b\n```\n\n### \u8fd0\u884c\u751f\u6210\u7684\u9879\u76ee\n\n```bash\ncd my-web-app\npip install -e .\npython src/main/application.py\n```\n\n\u9879\u76ee\u4f1a\u542f\u52a8\u4e00\u4e2aFastAPI\u670d\u52a1\u5668\uff0c\u5305\u542b\uff1a\n- **API\u6587\u6863**: http://localhost:8000/docs\n- **\u5065\u5eb7\u68c0\u67e5**: http://localhost:8000/health\n- **\u7528\u6237API**: http://localhost:8000/api/users/\n\n## \u9ad8\u7ea7\u7528\u6cd5\n\n### \u6761\u4ef6Bean\u6ce8\u518c\n\n```python\n@Configuration\nclass ConditionalConfig:\n \n @Bean\n def development_service(self):\n if os.getenv(\"ENV\") == \"dev\":\n return DevelopmentService()\n return ProductionService()\n```\n\n### Bean\u4f5c\u7528\u57df\n\n```python\n@Component\nclass SingletonService:\n \"\"\"\u9ed8\u8ba4\u5355\u4f8b\u4f5c\u7528\u57df\"\"\"\n pass\n\n# \u83b7\u53d6\u7684\u603b\u662f\u540c\u4e00\u4e2a\u5b9e\u4f8b\nservice1 = get_bean(SingletonService)\nservice2 = get_bean(SingletonService)\nassert service1 is service2 # True\n```\n\n### \u591a\u73af\u5883\u914d\u7f6e\n\n```python\n@Configuration\nclass DatabaseConfig:\n \n @Bean\n def database_url(self):\n env = os.getenv(\"ENV\", \"dev\")\n if env == \"prod\":\n return \"postgresql://prod-server:5432/myapp\"\n else:\n return \"sqlite:///./dev.db\"\n```\n\n## \u6700\u4f73\u5b9e\u8df5\n\n### 1. \u9879\u76ee\u7ed3\u6784\n\n```\nyour-app/\n\u251c\u2500\u2500 src/main/\n\u2502 \u251c\u2500\u2500 controller/ # Web\u63a7\u5236\u5668\n\u2502 \u251c\u2500\u2500 service/ # \u4e1a\u52a1\u903b\u8f91\u670d\u52a1\n\u2502 \u251c\u2500\u2500 repository/ # \u6570\u636e\u8bbf\u95ee\u5c42\n\u2502 \u251c\u2500\u2500 model/ # \u6570\u636e\u6a21\u578b\n\u2502 \u251c\u2500\u2500 config/ # \u914d\u7f6e\u7c7b\n\u2502 \u2514\u2500\u2500 application.py # \u5e94\u7528\u5165\u53e3\n```\n\n### 2. \u5206\u5c42\u67b6\u6784\n\n```python\n# \u63a7\u5236\u5668\u5c42\n@Component\nclass UserController:\n user_service: UserService = Autowired()\n\n# \u670d\u52a1\u5c42\n@Service\nclass UserService:\n user_repository: UserRepository = Autowired()\n\n# \u6570\u636e\u8bbf\u95ee\u5c42\n@Component\nclass UserRepository:\n database: Database = Autowired()\n```\n\n### 3. \u914d\u7f6e\u7ba1\u7406\n\n```python\n@Configuration\nclass AppConfiguration:\n \n @Bean\n def app_settings(self):\n return AppSettings(\n database_url=os.getenv(\"DATABASE_URL\"),\n redis_url=os.getenv(\"REDIS_URL\"),\n secret_key=os.getenv(\"SECRET_KEY\")\n )\n```\n\n## API\u53c2\u8003\n\n### \u88c5\u9970\u5668\n\n- `@Component` - \u6807\u8bb0\u7ec4\u4ef6\u7c7b\n- `@Service` - \u6807\u8bb0\u670d\u52a1\u7c7b\uff08@Component\u522b\u540d\uff09\n- `@Configuration` - \u6807\u8bb0\u914d\u7f6e\u7c7b\n- `@Bean` - \u6807\u8bb0Bean\u5de5\u5382\u65b9\u6cd5\n- `@Autowired()` - \u6807\u8bb0\u81ea\u52a8\u6ce8\u5165\u5b57\u6bb5\n- `@SpringBootApplication()` - \u6807\u8bb0\u5e94\u7528\u4e3b\u7c7b\n\n### \u51fd\u6570\n\n- `get_bean(cls_or_name)` - \u83b7\u53d6Bean\u5b9e\u4f8b\n- `get_context()` - \u83b7\u53d6\u5e94\u7528\u4e0a\u4e0b\u6587\n- `initialize_context(packages)` - \u521d\u59cb\u5316\u4e0a\u4e0b\u6587\n- `is_context_initialized()` - \u68c0\u67e5\u4e0a\u4e0b\u6587\u662f\u5426\u5df2\u521d\u59cb\u5316\n\n### \u7c7b\n\n- `ApplicationContext` - \u5e94\u7528\u4e0a\u4e0b\u6587\n- `Container` - IoC\u5bb9\u5668\n- `ComponentScanner` - \u7ec4\u4ef6\u626b\u63cf\u5668\n\n## \u793a\u4f8b\u9879\u76ee\n\n\u67e5\u770b [examples](examples/) \u76ee\u5f55\u4e2d\u7684\u5b8c\u6574\u793a\u4f8b\uff1a\n\n- [\u57fa\u7840Web\u5e94\u7528](examples/web-app/) - FastAPI + Spring-Py\n- [\u5fae\u670d\u52a1\u793a\u4f8b](examples/microservice/) - \u591a\u670d\u52a1\u67b6\u6784\n- [\u6570\u636e\u5e93\u96c6\u6210](examples/database/) - SQLAlchemy\u96c6\u6210\n\n## \u5f00\u53d1\n\n### \u73af\u5883\u8bbe\u7f6e\n\n```bash\ngit clone https://github.com/spring-py/spring-py.git\ncd spring-py\nuv sync\n```\n\n### \u8fd0\u884c\u6d4b\u8bd5\n\n```bash\nuv run pytest tests/\n```\n\n### \u6784\u5efa\n\n```bash\nuv build\n```\n\n## \u8d21\u732e\n\n\u6b22\u8fce\u8d21\u732e\u4ee3\u7801\uff01\u8bf7\u67e5\u770b [CONTRIBUTING.md](CONTRIBUTING.md) \u4e86\u89e3\u8be6\u7ec6\u4fe1\u606f\u3002\n\n## \u8bb8\u53ef\u8bc1\n\n\u672c\u9879\u76ee\u91c7\u7528 MIT \u8bb8\u53ef\u8bc1 - \u67e5\u770b [LICENSE](LICENSE) \u6587\u4ef6\u4e86\u89e3\u8be6\u60c5\u3002\n\n## \u66f4\u65b0\u65e5\u5fd7\n\n### v0.1.0\n\n- \u2705 \u57fa\u672c\u7684IoC\u5bb9\u5668\u529f\u80fd\n- \u2705 \u7ec4\u4ef6\u626b\u63cf\u548c\u6ce8\u518c\n- \u2705 \u4f9d\u8d56\u6ce8\u5165\u652f\u6301\n- \u2705 @Bean\u5de5\u5382\u65b9\u6cd5\n- \u2705 \u5168\u5c40\u4e0a\u4e0b\u6587\u7ba1\u7406\n- \u2705 CLI\u9879\u76ee\u751f\u6210\u5de5\u5177\n- \u2705 FastAPI\u96c6\u6210\u652f\u6301\n\n### v0.1.3\n- \u2705 \u4fee\u590d\u90e8\u5206\u56e0\u540d\u79f0\u5bfc\u81f4\u7684\u95ee\u9898\n\n### v0.1.4\n- \u2705 \u5b8c\u5584\u542f\u52a8\u6a21\u677f\uff0c\u589e\u5f3a\u4e0efastapi\u7684\u6574\u5408\n\n## \u793e\u533a\n\n- **GitHub**: https://github.com/spring-py/spring-py\n- **\u6587\u6863**: https://spring-py.readthedocs.io\n- **\u8ba8\u8bba**: https://github.com/spring-py/spring-py/discussions\n- **\u95ee\u9898\u53cd\u9988**: https://github.com/spring-py/spring-py/issues\n\n---\n\n**Spring-Py** - \u8ba9Python\u5f00\u53d1\u50cfSpring\u4e00\u6837\u7b80\u5355! \ud83d\ude80\n",
"bugtrack_url": null,
"license": null,
"summary": "A Python implementation of Spring Framework IoC container",
"version": "0.1.5",
"project_urls": null,
"split_keywords": [
"dependency-injection",
" framework",
" ioc",
" spring"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "6a421d1a65d85f9d20cf6e8a6d6410a19cd519f5b5d926fc8b1f1b51f84a1af5",
"md5": "1061e81b218164c6e399299bbf79a079",
"sha256": "4e71afc89306b440ca3ccb50065765d26b68a9d7b2cc00de6e6b2ce502a79193"
},
"downloads": -1,
"filename": "spring_py_core-0.1.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1061e81b218164c6e399299bbf79a079",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.11",
"size": 21783,
"upload_time": "2025-08-14T05:02:22",
"upload_time_iso_8601": "2025-08-14T05:02:22.656457Z",
"url": "https://files.pythonhosted.org/packages/6a/42/1d1a65d85f9d20cf6e8a6d6410a19cd519f5b5d926fc8b1f1b51f84a1af5/spring_py_core-0.1.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b5b6045ef1a05435b028cd793aaadc88fd8dac23ec7f7a35699af7c09493d63a",
"md5": "6558dc930d2341471cc89e1da6d4b069",
"sha256": "1fc56880432bbcd98b4ef0524df9006304e3c1bee1d32545d26d8f48ee8b83a6"
},
"downloads": -1,
"filename": "spring_py_core-0.1.5.tar.gz",
"has_sig": false,
"md5_digest": "6558dc930d2341471cc89e1da6d4b069",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.11",
"size": 35699,
"upload_time": "2025-08-14T05:02:25",
"upload_time_iso_8601": "2025-08-14T05:02:25.059661Z",
"url": "https://files.pythonhosted.org/packages/b5/b6/045ef1a05435b028cd793aaadc88fd8dac23ec7f7a35699af7c09493d63a/spring_py_core-0.1.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-14 05:02:25",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "spring-py-core"
}