• Bean
    • 创建 Bean
      • @Bean()
      • Config
    • Bean 初始化
    • 获取 Bean
      • @Inject
      • BeanFactory

    Bean

    Swoft 中一个 Bean 就是一个类的一个对象实例。 容器就是一个巨大的工厂,用于存放和管理 Bean 生命周期

    创建 Bean

    创建 Bean 通过 config 配置方式 还可以通过 @Bean) 注解创建

    @Bean()

    1. <?php declare(strict_types=1);
    2. namespace SwoftTest\Bean\Testing\Definition;
    3. use Swoft\Bean\Annotation\Mapping\Bean;
    4. /**
    5. * Class PrototypeClass
    6. *
    7. * @since 2.0
    8. *
    9. * @Bean(name="prototype", scope=Bean::PROTOTYPE, alias="pro")
    10. */
    11. class PrototypeClass
    12. {
    13. // ....
    14. }
    • scope

      • Bean::SINGLETON 单例Bean
      • Bean::PROTOTYPE 原型Bean
      • Bean::REQUEST 请求Bean
    • name
      指定一个为bean 指定一个名称,有时候你可能只需要配置一个 name 可以这样写@Bean("xxx")这样默认是参数的 name。

    • alias
      为 bean 指定一个别名, 你可以通过别名获取它

    @Bean 定义的在初始化的时候如果有构造函数需要注入参数 请给默认值,然后通过配置的覆盖构造函数所需参数

    scope 注入 Bean 类型,默认单例

    Config

    1. <?php declare(strict_types=1);
    2. namespace SwoftTest\Bean\Testing\Definition;
    3. /**
    4. * TestBean
    5. *
    6. * @since 2.0
    7. */
    8. class TestBean
    9. {
    10. /**
    11. * @var SingletonClass
    12. */
    13. private $singleton;
    14. /**
    15. * @var \JWT
    16. */
    17. private $jwt;
    18. /**
    19. * TestBean constructor.
    20. *
    21. * @param SingletonClass $singleton
    22. */
    23. public function __construct(SingletonClass $singleton)
    24. {
    25. $this->singleton = $singleton;
    26. }
    27. }

    配置方式 指定 class 的方式

    1. 'testBean' => [
    2. 'class' => TestBean::class,
    3. [\bean('singleton')],
    4. 'jwt' => \bean('jwt'),
    5. '__option' => [
    6. 'scope' => Bean::PROTOTYPE,
    7. 'alias' => 'testBean-alias'
    8. ]
    9. ],

    testBean 这个 key 你可以理解为是一个容器的名称。

    • class 参数的指定 Bean 使用那一个类
    • 下面这个数组[\bean('singleton')],构造函数所需参数
    • __option 这个swoft 自带的你可以指定:
      • scope 指定 Bean 是用哪个级别
      • alias 指定 Bean 的别名

    当然你也可以注入自己定义的属性 比如:

    • jwt 这个是上面TestBean类定义的属性,底层会通过反射注入config中的参数

    通过 配置文件配置的 Bean 优先级最高因为它是最后执行的,如果配置的已经是一个 Beanconfig的 配置的将会覆盖它

    Bean 初始化

    在配置文件中使用 \bean('xx.xx') 使用.调用这种方式,暂不支持。

    每一个 Bean初始化的时候会自动检查init()这个方法是否存在

    如果存在会被首先调用,你可以在该方法中进行一些初始化操作, 作用类似 golang 中的init方法。

    获取 Bean

    @Inject

    scoreBean::SINGLETONBean::PROTOTYPE级别的bean可以通过 @Inject 属性注入,底层会通过反射自动注入属性中。

    Bean::REQUEST bean 不能使用 @Inject 注入

    1. /**
    2. * @Inject("config")
    3. *
    4. * @var Config
    5. */
    6. private $config;
    • name 定义属性注入的bean名称。如果name为空,默认为@var 定义的类型。这个name 可以是一个完整的类名,也可以是bean别名/bean名称

      BeanFactory

    BeanFactory提供了一种先进的配置机制来管理任何种类的bean。

    获取scoreBean::SINGLETONBean::PROTOTYPE

    可以使用下面,以获取 wsRouter 为例:

    1. /** @var Router $router */
    2. $router = Swoft::getBean('wsRouter');
    3. $router = BeanFactory::getBean('wsRouter');
    4. $router = Container::$instance->get('wsRouter')
    5. $router = BeanFactory::getContainer()->get('wsRouter')

    上述这几种方式都可以Bean::SINGLETONBean::PROTOTYPE类型的bean

    你也可以指定类型获取 :

    例如:获取单例类型的bean

    1. /* @var WsDispatcher $dispatcher */
    2. $dispatcher = BeanFactory::getSingleton('wsDispatcher');

    注意BeanFactory::getBean只能获取到 框架启动加载的 bean,不能获取到 scoperequestbean

    request bean 的类型是 2.x 新加的

    获取 scorerequest类型的 你可以这样获取

    1. $requestBean = BeanFactory::getRequestBean(RequestClass::class, (string)Co::tid());

    一般 request 类型的 bean 通常是与顶级协程ID绑定在一起的

    判断当前环境是否存在 某个 bean

    1. $exist = BeanFactory::hasBean($name);

    判断是否是一个单例的 bean

    1. $isSingleton = BeanFactory::isSingleton('name')