上一篇解读完了关于 AnnotationProcess 这个对象初始化时所做的处理,大致为收集所有的需要加载,并含有注解的类.并解析,分类,映射成一个map然后存入AnnotationRegister中的静态变量中.
那么这次讲解的 BeanProcess 内容有点儿长,分为几个部分讲解完毕
BeanProcess 概述
BeanProcess 文件地址在 swoft/framework/src/Processor/BeanProcessor.php.主要运行内容
1 | public function handle(): bool |
从上面我们可以看出,程序从 AnnotationRegister 获取之前已收集好的类的相关描述,并注入可一个处理类,然后开始了程序的初始化.
根据IDE的跳转提示我们可以知道 init 实际上是调用了一个单例模式的 Contrainer, 并做了初始化.
1 | public function init(): void |
初始化分为三步
parseAnnotations
1 | private function parseAnnotations(): void |
它调用了 AnnotationObjParser的方法,并重新对传入参数做了赋值
但此时只有 definitions 有值,打印之后则会发现 definitions 的值是config 中的所有配置.其余都为空数组.
那么 parseAnnotations() 方法对各个类,方法,属性上的注解完成解析,并映射成了一个数组的形式。根据追踪,我们可以看到函数实际执行的代码
1 | private function parseOneClassAnnotations(string $className, array $classOneAnnotations): void |
实际相关代码太长,这里就不一一贴出了
在了解这个方法作用的时候我们先要知道,在swoft中自定义注解需要有两种类文件.在此我们以Aop 组件来讲解.
组件中 Annotation 文件夹结构如下
1 | . |
Mapping 文件夹内的类则是对注解定义,定义其名字,注解类型,所含参数.总的来说是对注解的一个描述
Parser 文件夹内的文件则是对 Mapping 文件夹里注解的一个解析.
parseDefinitions
而 parseDefinitions 主要职责则是更新配置
1 | public function parseDefinitions(): array |
objectDefinitions 代表所有已实例化完毕,且完成诸如操作了的对象. 这里的操作则是对该对象的默认配置做更新,或创建操作.
initializeBeans
initializeBeans 操作则是最核心的一环,它初始化了所有 bean, 并在此完成了所有注解的注入
1 | private function initializeBeans(): void |
其中REQUEST与SESSION是bean的类型,这个会在后续解释。主要操作集中在newBean中
1 | private function newBean(string $beanName, string $id = '') |
此处beforeInit()对每一个bean命名注册,完成了 aop(面向切面) 的初始化。这个点会在后续详细解释。
接下来就可以看到,程序通过Reflection对每个bean实例化,并对含有Property注解的成员进行注入。接着调用每个bean中的init函数。最后在setNewBean()方法中,根据bean的类型,放入不同的pool中。方便调用。至此完成了所有工作
总结
BeanProcesseor其实算得上是Swoft的核心要点了。本次解析的代码设计的地方有点多,有些东西没有详细讲解。这些会在后续慢慢讲解。