基本功能介绍
注解和注释的区别
注解原理
在框架启动的时候会把所有的php文件扫描一遍,然后获取类的注释,当找到注解,根据定义的解析类,实现一部分业务逻辑,来扩展程序的功能
@Bean 注解创建 bean 容器实例
简单示例
定义一个类并使用 bean 注解
namespace App\Common;
use Swoft\Bean\Annotation\Mapping\Bean;
/**
* Class wiketest
*
* @since 2.0
*
* @Bean()
*/
class wiketest
{
}
此时就定义了一个最基础的 bean 实例,默认 baen注解 scope 是 Bean::SINGLETON,我们可以根据需要配置
bean 注解的参数使用
/**
*@Bean("wiketest") //定义一个名称为 wiketest 的 bean实例 */
*/
/**
*@Bean(name="wiketest") //和上个方法功能一样
*/
/**
*@Bean(name="wiketest",alias="wike001") //不但定义了name属性,同时定义了别名,在调用的时候可以传入别名,不推荐使用
*/
/**
* @Bean(name="wiketest",scope=Bean::SINGLETON) //这里定义了 bean 的作用域
*/
bean 注解作用域介绍
类型特点Bean::SINGLETON全局只会初始化一次,全局共享该对象,需要避免同时读写操作,不然会出现数据污染。Bean::PROTOTYPE全局只会初始化一次,在框架启动的时候初始化,每次获取的时候通过 clone ,clone 比 new 更快Bean::REQUEST框架启动不会初始化,只有请求的时候才会初始化,生命周期跟随请求开始到结束。
单例模式例子
namespace App\Common;
use Swoft\Bean\Annotation\Mapping\Bean;
/**
* @Bean()
*/
class Wike
{
private $i = 0;
public function __construct()
{
echo "wike __construct\n";
}
public function getNum()
{
$this->i++;
return "wike Bean:".$this->i."\n";
}
}
@Bean 默认就是单例模式,可以不传参数。在单例模式中每次请求的时候,$i 都会不一样
原型模式例子
namespace App\Common;
use Swoft\Bean\Annotation\Mapping\Bean;
/**
* @Bean(scope=Bean::PROTOTYPE,name="wike")
*/
class Wike
{
private $i = 0;
public function __construct()
{
echo "wike __construct\n";
}
public function getNum(){
$this->i++;
return "wike Bean:".$this->i."\n";
}
}
在原型模式,每次请求的时候,$i 都会重置为0,因为底层是通过 clone 实现的,每次获取这个 Bean 的时候都是 clone 框架启动的时候初始化的对象。
请求模式例子
namespace App\Common;
use Swoft\Bean\Annotation\Mapping\Bean;
/**
* @Bean(scope=Bean::REQUEST,name="wike")
*/
class Wike
{
private $i = 0;
public function __construct()
{
echo "wike __construct\n";
}
public function getNum(){
$this->i++;
return "wike Bean:".$this->i."\n";
}
}
请求模式的 Bean 在每次请求都会重新 new 一次,并且挂在到当前请求的协程之上,生命周期跟随当次请求,当前请求开始而开始,当前请求结束而结束。请求模式的 Bean 需要通过协程id获取。
获取方式
bean容器的获取 官方一共有好几种,我们只推荐其中个人喜好的方式,其他方式个人觉得比较繁琐.更多的方式请查阅官方文档
单例模式获取的方式
public function index(): Response
{
$wike = bean(wike::class)
}
原型模式获取的方式
public function index(): Response
{
$wike = bean(wike::class)
}
请求模式的获取的方式
public function index(): Response
{
$tid = (string)Co::tid();
$wike = BeanFactory::getRequestBean(wike::class, (string) $tid);
}