上回内容速读:
注解注册
书接上文,”swoft/framework/src/Processor/AnnotationProcessor.php” 的handle方法完成了注解的注册
| 1 | public function handle(): bool | 
重点在 AnnotationRegister::load上,实际上该方法运行的是 swoft/annotation/src/Resource/AnnotationResource.php文件中的 load 方法. 我们分析下面函数体
| 1 | public function load(): void | 
由于每个依赖包中的src文件夹下都有一个Autoloader.php文件 都实现了一个 名为getPrefixDirs的方法:
| 1 | public function getPrefixDirs(): array | 
$this->classLoader->getPrefixesPsr4()搜集了可以加载的组件所在命名空间和文件地址,并返回一个关联数组.
所以$prefixDirsPsr4 则是由命名空间做key,文件所在路径为值的关联数组
然后,通过循环,检测出需要遍历的文件夹,过滤掉不合法地址,然后通过registerAutoLoaderFile(),addAutoLoader() 将所有需要注册的文件路径放入 AnnotationRegister 对象中的相应成员变量中.这里就不一一展示了.
ps:如果对上面加在机制不太熟的,就需要补一补 composer 相关知识了
然后程序调用了 loadAnnotation(),传入的则是一个 Autoloader对象,以便迭代.
迭代注册
在 loadAnnotation() 中,函数体内进行双重for循环,迭代所有需要注册的文件,并做条件判断与筛选,过滤掉不需要注册的类,最终执行 parseAnnotation() 方法.传入命名空间及类名:
| 1 | 
 | 
该方法使用反射类,获取类的反射. 然后对其做解析操作,并把成功的结果集,注册进 AnnotationRegister 的静态成员中.
那么 parseOneClassAnnotation()是如何解析的呢?
| 1 | private function parseOneClassAnnotation(ReflectionClass $reflectionClass): array | 
它使用了 Doctrine 的 AnnotationReader 类,对该类中的所有注释进行读取.
在此之前,我们先要明白,在 swoft 注解有三种形式
- 对类本身的注解
- 对类中方法的注解
- 对类中成员的注解
所以接下来的代码可以分为 3 块. 从注释中就可以看出来, 就是对以上 3 类的解析.然后用放进 $oneClassAnnotation中,以关联数组的形式.
$oneClassAnnotation 则形成了一个对该类拥有的所有注解的一个简易描述.形式为:
| 1 | [ | 
然后返回,然后parseAnnotation() 方法中的AnnotationRegister::registerAnnotation 会将它收集值该类静态成员$annotation,成为一个数组集合,方便后面的调用。
总结
至此 AnnotationProcessor 所做的主要工作也就结束了.自己看了的朋友大概也发现了,这个 process 只仅仅做了一个收集的工作,并未有完成实质性的操作.
确实,此处只是做了一个记录,所有注入操作还未真正开始。下一篇将会讲到 BeanProcessor. 这个概念也是swoft的一个核心亮点概念,并且后面会相关联到swoft 中的一个 event 组件。