Panda.Ioc - 如何定义对象
对于 Panda Ioc 来说,它面对的配置文件就是层层嵌套的 “名值对集合”,或者说是 Map 集合。 事实上,它是先把整个配置文件解析成 Map 再做判断的。
如果一个 Map 仅包括如下的键,则被认为是一个严格定义的注入对象:
关键字 | 说明 |
---|---|
type | 对象类型 |
singleton | 是否单例 |
scope | 生命周期范围 |
events | 监听事件 |
args | 构造函数参数 |
fields | 字段设定 |
factory | 工厂方法 |
否则,这个 Map 会被认为,是在声明对象的每个字段的匿名对象。
匿名对象
如果,一个字段的值就是上述这样的一个 “严格定义的Map”,那么自然会被认为是一个匿名对象。
因为这个对象没有名字,你不能通过Ioc接口直接获得,它隐藏在某个对象的某个字段里面。
匿名对象,没有所谓的单例,即使声明了 singleton: true 也没有用。 如果它的宿主是单例,它自然只会被创建一次。否则,每次宿主被创建的时候,它都会被创建。
JSON 配置文件:
tom : {
name : 'Tom',
// 请注意,在这里, 'friend' 字段,直接声明了另外一个对象
friend : {
type : 'panda.demo.ioc.json.Pet',
fields : {
name : 'Jerry'
}
}
}
调用代码:
Ioc ioc = new DefaultIoc(new JsonLoader("panda/demo/ioc/json/Pets.json"));
Pet pet = ioc.get(Pet.class, "tom");
System.out.println(pet.getFriend().getName());
ioc.depose();
控制台输出:
Jerry
工厂方法
语法1 (类全名@方法名):
{
type : "panda.demo.ioc.Pet",
args : [ "Tom" ],
factory: "com.my.PetFactory@create"
}
其中com.my.PetFactory是工厂类的类全名, create是工厂方法, 其参数是”Tom“。
语法2 (#Ioc对象名.方法名):
{
type : "panda.demo.ioc.Pet",
args : [ "Tom" ],
factory: "#PetFactory.create"
}
其中PetFactory是Ioc对象名, create是工厂方法, 其参数是”Tom“。
语法3 (${EL表达式}):
{
type : "panda.demo.ioc.Pet",
args : [ "Tom" ],
factory: "${'com.my.PetFactory'@create()}"
}
其中 ${‘com.my.PetFactory’@create()} 是EL表达式, EL表达式的书写方法可参照这里。
请注意,EL表达式忽略了参数设置 args : [ “Tom” ]。
更详细的说明,请参照 EL表达式。
生命周期范围
默认的scope是app, 与ioc容器共存亡。 可选的还有request和session或者自定义的scope, IOC单独几乎不会用,MVC模块会用到request,session的scope。 一般情况下,不需要也不应该设置scope的值。