一、Bean
在 Swoft 中,一个 Bean 就是一个类的一个对象实例。 它(Bean)是通过容器来存放和管理整个生命周期的。
最直观的感受就是省去了频繁new的过程,节省了资源的开销。
二、Bean的使用
1、创建Bean
在【gateway/app/Http/Controller】下新建一个名为【TestController.php】的文件,文件内容如下。注释:“gateway”为我的项目名称。
<?php declare(strict_types=1);
/**
* This file is part of Swoft.
*
* @link https://swoft.org
* @document https://swoft.org/docs
* @contact group@swoft.org
* @license https://github.com/swoft-cloud/swoft/blob/master/LICENSE
*/
namespace App\Http\Controller;
use Swoft\Http\Server\Annotation\Mapping\RequestMapping;
use Swoft\Bean\Annotation\Mapping\Bean;
/**
* Class TestController
*
* @since 2.0
* @Bean()
*/
class TestController
{
/**
* @RequestMapping("index")
*
*/
public function index()
{
return 'testBean';
}
}
2、调用Bean
在【gateway/app/Http/Controller】目录下随便找个已近存在的文件进行编辑调用,本文就选择了【RpcController.php】文件,这个文件在项目创建之初就存在了。
<?php declare(strict_types=1);
/**
* This file is part of Swoft.
*
* @link https://swoft.org
* @document https://swoft.org/docs
* @contact group@swoft.org
* @license https://github.com/swoft-cloud/swoft/blob/master/LICENSE
*/
namespace App\Http\Controller;
use Swoft\Bean\BeanFactory;
use Swoft\Http\Server\Annotation\Mapping\Controller;
use Swoft\Http\Server\Annotation\Mapping\RequestMapping;
/**
* Class RpcController
*
* @since 2.0
*
* @Controller()
*/
class RpcController
{
/**
* @RequestMapping("list")
* @return array
*/
public function getList(): array
{
$bean = BeanFactory::getBean(TestController::class);
return [$bean->index()];
}
}
3、展示结果
在【TestController】文件中的【index】方法中返回的内容是“testBean“,调用的时候返回了一个数组。我的浏览器安装了JSON的格式化工具,所以返回的数据都格式化了。
4、说明
在上面两个文件中都有标红的地方,两个文件的标红处是有关联的。
1、在【TestController】文件中,Bean的写法有很多种,如下所示:
- 第一种
- 写法:@Bean()
- 调用:BeanFactory::getBean(TestController::class);
- 第二种
- 写法:@Bean("testBean")
- 调用:BeanFactory::getBean('testBean');
- 注意点:@Bean("testBean")中的引号一定要双引号,单引号要报错。
- 第三种
- 写法:@Bean(name="testBean",scope=Bean::SINGLETON)
- 调用:BeanFactory::getBean('testBean');
- 注意点:scope=Bean::SINGLETON 中的scope有三个值,分别是 Bean::SINGLETON(默认), Bean::PROTOTYPE, Bean::REQUEST。
- 第四种
- 写法:@Bean(name="testBean",scope=Bean::SINGLETON,alias="testBeanAlias")
- 调用:BeanFactory::getBean('testBeanAlias');
- 注意点:alias 表示别名的意思,使用了 alias 那么在调用时可以用别名调用。当然,设置别名后也可以不用别名调用,还是用原来的name也是可以的。
2、关于Bean的源码,可以打开【gateway/vendor/swoft/bean/src/Annotation/Mapping/Bean.php】文件查看。我下载的Swoft版本是2.0的,Bean.php文件内容如下:
<?php declare(strict_types=1);
/**
* This file is part of Swoft.
*
* @link https://swoft.org
* @document https://swoft.org/docs
* @contact group@swoft.org
* @license https://github.com/swoft-cloud/swoft/blob/master/LICENSE
*/
namespace Swoft\Bean\Annotation\Mapping;
use Doctrine\Common\Annotations\Annotation\Attribute;
use Doctrine\Common\Annotations\Annotation\Attributes;
use Doctrine\Common\Annotations\Annotation\Enum;
use Doctrine\Common\Annotations\Annotation\Target;
/**
* Class Bean
*
* @Annotation
* @Target("CLASS")
* @Attributes({
* @Attribute("name", type="string"),
* @Attribute("scope", type="string"),
* @Attribute("alias", type="string"),
* })
*
* @since 2.0
*/
final class Bean
{
/**
* Singleton bean
*/
public const SINGLETON = 'singleton';
/**
* New bean
*/
public const PROTOTYPE = 'prototype';
/**
* New bean from every request
*/
public const REQUEST = 'request';
/**
* New bean for one session
*/
public const SESSION = 'session';
/**
* Bean name
*
* @var string
*/
private $name = '';
/**
* Bean scope
*
* @var string
* @Enum({Bean::SINGLETON, Bean::PROTOTYPE, Bean::REQUEST})
*/
private $scope = self::SINGLETON;
/**
* Bean alias
*
* @var string
*/
private $alias = '';
/**
* Bean constructor.
*
* @param array $values
*/
public function __construct(array $values)
{
if (isset($values['value'])) {
$this->name = $values['value'];
}
if (isset($values['name'])) {
$this->name = $values['name'];
}
if (isset($values['scope'])) {
$this->scope = $values['scope'];
}
if (isset($values['alias'])) {
$this->alias = $values['alias'];
}
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @return string
*/
public function getScope(): string
{
return $this->scope;
}
/**
* @return string
*/
public function getAlias(): string
{
return $this->alias;
}
}