SW-X的注解主要依赖反射类实现,只对控制器对应的入口方法有效。
服务会在启动阶段扫描控制器目录下的全部文件,并解析出相应的注解写入内存当中。
后续当请求进来时,会直接在内存中读取路由表以及对应的注解标签,所以性能消耗非常低。
由于注解是基于路由表实现的依赖注入,所以注解只对路由加载的主控制器方法有效,当再主方法内调用其他成员方法,又或者跨控制器调用它类方法时,依旧只有主控制器的注解有效。
下面我们用一个HTTP的控制器来讲解下:
<?php
namespace app\http;
use x\controller\Http;
class Index extends Http
{
/**
* 输出视图
* @RequestMapping(route="/", method="get", title="主页")
*/
public function index() {
$Db = $this->test();
}
/**
* @Ioc(class="\x\Db", name="Db")
* @RequestMapping(route="/test", method="post", title="测试获取")
*/
public function test() {
var_dump($this->Db);
return $this->Db;
}
}
上面的方法,在我们访问/test
路由的时候,Db
属性是注入成功的,
但当我们访问/
路由的时候就会发现,test()
方法是错误的,因为注解没有被继承,所以@Ioc
注解实际上并没有执行。
SW-X的注解,只对被路由器载入的控制器主方法有效。
当然,调用流程上,主方法挂载的注解,其流程上调用到的后续方法都可以使用。
SW-X中使用注解注入需要极强的规范要求,否则注解会解析失败,具体要求如下:
/** */
注释体内所包含@Ioc(class="依赖的类", name="注入的成员属性名称")
属性名称="",
的方式传递参数,都是强制""
双引号,后面接入一个,
英文逗号
SW-X中支持的所有注解元如下,也可以参考这个作为注解的使用规范:
/**
* @TestCase(class="\box\testcase\index\test1", title="用例一")
* @Ioc(class="\x\Db", function="name('user')", name="Db")
* @AopBefore(class="app\aop\Demo", function="before")
* @AopAfter(class="app\aop\Demo", function="after")
* @AopAround(class="app\aop\Demo", function="around")
* @AopThrows(class="app\aop\Demo", function="throws")
* @Param(name="id", type="int|string", value="1", empty="true", min="10", max="20", chinese="true", callback="\lifecycle\annotate_param")
* @RequestMapping(route="/index", method="GET|POST", title="路由描述")
* @Controller(prefix="user")
* @onRoute
*/
每个注解元的解释如下:
TestCase
:单元测试绑定Ioc
:依赖注入AopBefore
:AOP前置操作AopAfter
:AOP后置操作AopAround
:AOP环绕操作AopThrows
:AOP异常转发RequestMapping
:方法对应的路由绑定Controller
:控制器的前置路由绑定onRoute
:申明某个方法不能被路由访问Param
:对GET或POST参数进行前置校验