容器

Swoft 中一个 Bean 就是一个类的一个对象实例。 容器就是一个巨大的工厂,用于存放和管理 Bean 生命周期。

注解

@Bean

命名空间:\Swoft\Bean\Annotation\Bean

  • name 定义 Bean 别名,缺省默认类名
  • scope 注入 Bean 类型,默认单例,Scope::SINGLETON/Scope::PROTOTYPE(每次创建)
  • ref 指定引用 Bean ,用于定义在接口上面,指定使用哪个接口实现。

@Inject

命名空间:\Swoft\Bean\Annotation\Inject

  • name 定义属性注入的bean名称,缺省属性自动类型名称

定义bean

bean有两种方式定义,注解和数组配置

数组定义

  1. // 配置创建
  2. $beanConfig = [
  3. 'class' => MyBean::class,
  4. 'pro1' => 'v1',
  5. 'pro2' => 'v2',
  6. [ // 构造函数参数
  7. 'arg1',
  8. '${beanName}'
  9. ]
  10. ];
  • 数组中必须要有class字段定义
  • pro1/pro1 和类面的成员变量名称是一一对应
  • 属性值和构造函数参数值,都可以通过 ${xxx} 和 ${config.xx}, 注入Bean和引用properties配置信息

注解定义

注解定义使用PHP文档注解,在类上做一些标记,通过解析类注解,实现不同的功能。

  1. /**
  2. * @\Swoft\Bean\Annotation\Bean("userData")
  3. */
  4. class XxxBean
  5. {
  6. }

操作Bean

  1. App::getBean("name");
  2. ApplicationContext::getBean('name');
  3. BeanFactory::getBean('name');
  4. BeanFactory::hasBean("name");
  • App/ApplicationContext/BeanFactory都可从容器中得到Bean
  • hasBean 某个bean是否存在

实例

别名定义

  1. /**
  2. * @\Swoft\Bean\Annotation\Bean("userData")
  3. */
  4. class UserData
  5. {
  6. public function getData()
  7. {
  8. return [];
  9. }
  10. }
  11. /**
  12. * @\Swoft\Bean\Annotation\Bean()
  13. */
  14. class UserLogic
  15. {
  16. /**
  17. * @\Swoft\Bean\Annotation\Inject("userData")
  18. * @var \UserData
  19. */
  20. private $userData;
  21. private function getUser()
  22. {
  23. return $this->userData->getData();
  24. }
  25. }

缺省定义

  1. /**
  2. * @\Swoft\Bean\Annotation\Bean("userData")
  3. */
  4. class UserData
  5. {
  6. public function getData()
  7. {
  8. return [];
  9. }
  10. }
  11. /**
  12. * @\Swoft\Bean\Annotation\Bean()
  13. */
  14. class UserLogic
  15. {
  16. /**
  17. * @\Swoft\Bean\Annotation\Inject()
  18. * @var \UserData
  19. */
  20. private $userData;
  21. private function getUser()
  22. {
  23. return $this->userData->getData();
  24. }
  25. }

接口引用

  • 接口上面指定了使用的实现bean别名
  • 接口使用处,无需指定使用那个别名,会根据接口上面的引用注入不同的实例bean

    1. /**
    2. * @\Swoft\Bean\Annotation\Bean(ref="boy")
    3. */
    4. interface UserInterface
    5. {
    6. public function getData();
    7. }
    8. /**
    9. * @\Swoft\Bean\Annotation\Bean("boy")
    10. */
    11. class UserBoy implements \UserInterface
    12. {
    13. public function getData()
    14. {
    15. return 'boy';
    16. }
    17. }
    18. /**
    19. * @\Swoft\Bean\Annotation\Bean("girl")
    20. */
    21. class UserGirl implements \UserInterface
    22. {
    23. public function getData()
    24. {
    25. return 'girl';
    26. }
    27. }
    28. /**
    29. * @\Swoft\Bean\Annotation\Bean()
    30. */
    31. class UserLogic
    32. {
    33. /**
    34. * @\Swoft\Bean\Annotation\Inject()
    35. * @var \UserInterface
    36. */
    37. private $userData;
    38. private function getUser()
    39. {
    40. return $this->userData->getData();
    41. }#
    42. }