- Bean
- 创建 Bean
- @Bean()
- Config
- Bean 初始化
- 获取 Bean
- @Inject
- BeanFactory
- 创建 Bean
Bean
Swoft 中一个 Bean 就是一个类的一个对象实例。 容器就是一个巨大的工厂,用于存放和管理 Bean 生命周期。
创建 Bean
创建 Bean 通过 config 配置方式 还可以通过 @Bean) 注解创建
@Bean()
<?php declare(strict_types=1);namespace SwoftTest\Bean\Testing\Definition;use Swoft\Bean\Annotation\Mapping\Bean;/*** Class PrototypeClass** @since 2.0** @Bean(name="prototype", scope=Bean::PROTOTYPE, alias="pro")*/class PrototypeClass{// ....}
scope
- Bean::SINGLETON 单例Bean
- Bean::PROTOTYPE 原型Bean
- Bean::REQUEST 请求Bean
name
指定一个为bean 指定一个名称,有时候你可能只需要配置一个 name 可以这样写@Bean("xxx")这样默认是参数的 name。
- alias
为 bean 指定一个别名, 你可以通过别名获取它
@Bean定义的在初始化的时候如果有构造函数需要注入参数 请给默认值,然后通过配置的覆盖构造函数所需参数scope 注入 Bean 类型,默认单例
Config
<?php declare(strict_types=1);namespace SwoftTest\Bean\Testing\Definition;/*** TestBean** @since 2.0*/class TestBean{/*** @var SingletonClass*/private $singleton;/*** @var \JWT*/private $jwt;/*** TestBean constructor.** @param SingletonClass $singleton*/public function __construct(SingletonClass $singleton){$this->singleton = $singleton;}}
配置方式 指定 class 的方式
'testBean' => ['class' => TestBean::class,[\bean('singleton')],'jwt' => \bean('jwt'),'__option' => ['scope' => Bean::PROTOTYPE,'alias' => 'testBean-alias']],
testBean 这个 key 你可以理解为是一个容器的名称。
- class 参数的指定
Bean使用那一个类 - 下面这个数组
[\bean('singleton')],是构造函数所需参数 - __option 这个
swoft自带的你可以指定:- scope 指定
Bean是用哪个级别 - alias 指定
Bean的别名
- scope 指定
当然你也可以注入自己定义的属性 比如:
- jwt 这个是上面
TestBean类定义的属性,底层会通过反射注入config中的参数
通过 配置文件配置的
Bean优先级最高因为它是最后执行的,如果配置的已经是一个Bean,config的 配置的将会覆盖它
Bean 初始化
在配置文件中使用
\bean('xx.xx')使用.调用这种方式,暂不支持。
每一个 Bean初始化的时候会自动检查init()这个方法是否存在
如果存在会被首先调用,你可以在该方法中进行一些初始化操作, 作用类似 golang 中的init方法。
获取 Bean
@Inject
score为Bean::SINGLETON,Bean::PROTOTYPE级别的bean可以通过 @Inject 属性注入,底层会通过反射自动注入属性中。
Bean::REQUEST bean不能使用@Inject注入
/*** @Inject("config")** @var Config*/private $config;
- name 定义属性注入的bean名称。如果
name为空,默认为@var定义的类型。这个name可以是一个完整的类名,也可以是bean别名/bean名称。BeanFactory
BeanFactory提供了一种先进的配置机制来管理任何种类的bean。
获取score为Bean::SINGLETON,Bean::PROTOTYPE
可以使用下面,以获取 wsRouter 为例:
/** @var Router $router */$router = Swoft::getBean('wsRouter');$router = BeanFactory::getBean('wsRouter');$router = Container::$instance->get('wsRouter')$router = BeanFactory::getContainer()->get('wsRouter')
上述这几种方式都可以Bean::SINGLETON,Bean::PROTOTYPE类型的bean
你也可以指定类型获取 :
例如:获取单例类型的bean
/* @var WsDispatcher $dispatcher */$dispatcher = BeanFactory::getSingleton('wsDispatcher');
注意
BeanFactory::getBean只能获取到 框架启动加载的 bean,不能获取到scope为request的bean。
request bean 的类型是 2.x 新加的
获取 score为 request类型的 你可以这样获取
$requestBean = BeanFactory::getRequestBean(RequestClass::class, (string)Co::tid());
一般 request 类型的 bean 通常是与顶级协程ID绑定在一起的
判断当前环境是否存在 某个 bean
$exist = BeanFactory::hasBean($name);
判断是否是一个单例的 bean
$isSingleton = BeanFactory::isSingleton('name')
