Skip to main content

BeanPy 框架使用教程

一、框架简介

BeanPy 是一个轻量级的 Python 依赖注入框架,通过控制反转(IoC)模式管理对象的创建与依赖关系,支持单例/非单例模式、懒加载、生命周期管理及循环依赖处理,能有效降低代码耦合度,提升可维护性。

二、核心概念

  1. Bean:由框架管理的对象实例,可通过类定义注册为 Bean
  2. 依赖注入:框架自动将一个 Bean 注入到另一个 Bean 的依赖中
  3. 生命周期:Bean 从创建到销毁的完整过程,包含初始化和销毁阶段
  4. 后处理器:用于在 Bean 生命周期的特定阶段扩展功能

三、快速入门

1. 安装框架

(假设已通过合适方式安装,如本地包引用)

2. 定义 Bean 类

创建需要被框架管理的类,并通过装饰器声明依赖和生命周期方法:

# 示例:定义两个相互依赖的 Bean
class UserService:
    def __init__(self):
        self.order_service = None  # 依赖 OrderService

    # 注入 OrderService 依赖
    @inject(bean_name="order_service")
    def set_order_service(self, order_service):
        self.order_service = order_service

    # 初始化方法(依赖注入完成后执行)
    @post_construct
    def init(self):
        print("UserService 初始化完成")

    # 销毁方法(容器停止前执行)
    @pre_destroy
    def destroy(self):
        print("UserService 已销毁")


class OrderService:
    def __init__(self):
        self.user_service = None  # 依赖 UserService

    # 注入 UserService 依赖
    @inject(bean_name="user_service")
    def set_user_service(self, user_service):
        self.user_service = user_service

    @post_construct
    def init(self):
        print("OrderService 初始化完成")

    @pre_destroy
    def destroy(self):
        print("OrderService 已销毁")

3. 注册与使用 Bean

通过 BeanFactory 管理 Bean 的注册、启动和获取:

from beanpy.factory import BeanFactory

# 1. 创建 Bean 工厂
factory = BeanFactory()

# 2. 注册 Bean(名称需唯一)
factory.register_bean(
    cls=UserService,
    name="user_service",
    lazy=False,  # 非懒加载(容器启动时创建)
    single=True  # 单例模式(默认)
)
factory.register_bean(
    cls=OrderService,
    name="order_service",
    lazy=False
)

# 3. 启动容器(初始化非懒加载 Bean 并完成依赖注入)
factory.run()

# 4. 获取 Bean 实例
user_service = factory.get_bean("user_service")
order_service = factory.get_bean("order_service")

# 验证依赖注入是否成功
print(user_service.order_service is order_service)  # 输出:True
print(order_service.user_service is user_service)  # 输出:True

# 5. 停止容器(执行销毁方法)
factory.stop()

执行结果:

UserService 初始化完成
OrderService 初始化完成
True
True
UserService 已销毁
OrderService 已销毁

四、高级特性

1. 懒加载 Bean

对于资源消耗大或不常用的 Bean,可设置 lazy=True,使其在首次获取时才创建:

class LogService:
    @post_construct
    def init(self):
        print("LogService 初始化(懒加载)")

# 注册懒加载单例 Bean
factory.register_bean(LogService, "log_service", lazy=True)

factory.run()  # 启动时不会创建 LogService
log_service = factory.get_bean("log_service")  # 首次获取时创建

2. 非单例 Bean

通过 single=False 注册非单例 Bean,每次获取都会创建新实例:

class PaymentService:
    pass

# 注册非单例 Bean
factory.register_bean(PaymentService, "payment_service", single=False)

factory.run()
p1 = factory.get_bean("payment_service")
p2 = factory.get_bean("payment_service")
print(p1 is p2)  # 输出:False(非单例)

3. 后处理器扩展

(1)BeanFactoryPostProcessor:修改 Bean 定义

from beanpy.processor import BeanFactoryPostProcessor

class CustomFactoryProcessor(BeanFactoryPostProcessor):
    def handle(self, container):
        # 动态修改已注册的 Bean 定义(例如将懒加载改为非懒加载)
        log_def = container.get_definition("log_service")
        if log_def:
            # 注意:实际需通过自定义 BeanDefinition 子类实现修改逻辑
            pass

# 注册后处理器
factory.register_bean_factory_post_processor(CustomFactoryProcessor())

(2)BeanPostProcessor:增强 Bean 实例

from beanpy.processor import BeanPostProcessor

class CustomBeanProcessor(BeanPostProcessor):
    def post_before_init(self, bean):
        # 初始化前执行(如打印日志)
        print(f"初始化前:{bean.__class__.__name__}")

    def post_after_init(self, bean):
        # 初始化后执行(如代理增强)
        print(f"初始化后:{bean.__class__.__name__}")
        return bean

# 注册后处理器
factory.register_bean_post_processor(CustomBeanProcessor())

4. 循环依赖处理

框架通过二级缓存自动解决单例 Bean 的循环依赖(如入门示例中的 UserService 和 OrderService):

  • 一级缓存(__single_objects):存储完全初始化的单例 Bean
  • 二级缓存(__early_single_objects):存储未完成依赖注入的早期实例,供循环依赖时临时引用

五、使用注意事项

  1. Bean 名称唯一性:注册时需保证 name 唯一,否则会抛出 BeanPyException
  2. 依赖注入方法:被 @inject 装饰的方法需接收一个参数(注入的 Bean 实例)
  3. 容器状态:必须先调用 run() 启动容器,才能通过 get_bean() 获取实例
  4. 循环依赖限制:仅支持单例 Bean 的循环依赖,非单例 Bean 不支持
  5. 生命周期方法:@post_construct 和 @pre_destroy 装饰的方法需为无参实例方法

通过以上步骤,即可利用 BeanPy 框架实现对象的自动化管理和依赖注入,简化代码结构并提升可维护性。

Metadata

Release files for beanpy 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for beanpy 0.0.1
File Size Uploaded Provenance
beanpy-0.0.1.tar.gz 13.8 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for beanpy 0.0.1
File Interpreter ABI Platform
beanpy-0.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 26.2 kB

Release files / beanpy-0.0.1.tar.gz

Download URL beanpy-0.0.1.tar.gz
Size 13.8 kB
Tags Source
SHA-256 checksum
How to use checksums
0e9159c0b9ecdfcb30c6221da23c705ccda01c408fab7944187be3535662bc0f
BLAKE2b-256 checksum
How to use checksums
20f8952c657f372eb55e9f973d8c4c9fb45646a8d3720c505b970d69b9920f7d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.11

Release files / beanpy-0.0.1-py3-none-any.whl

Download URL beanpy-0.0.1-py3-none-any.whl
Size 12.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9047f6d41590947050f9757a2aefa4d1a84fb1bfdd814f3b248c85c87cdaed29
BLAKE2b-256 checksum
How to use checksums
963128c08041f896f3dcaeaf7df6ba4cf611195859d78b2e02a5d16c57498ddc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.11

Security for beanpy 0.0.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.0.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page