swoft2教程系列-bean注解

基本功能介绍

注解和注释的区别

注解原理

在框架启动的时候会把所有的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);

}
发布了543 篇原创文章 · 获赞 32 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_36691991/article/details/105045355