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

  • 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')