spring-py-core


Namespring-py-core JSON
Version 0.1.5 PyPI version JSON
download
home_pageNone
SummaryA Python implementation of Spring Framework IoC container
upload_time2025-08-14 05:02:25
maintainerNone
docs_urlNone
authorNone
requires_python>=3.11
licenseNone
keywords dependency-injection framework ioc spring
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.74113s