如何定义对象
Jul 10, 2017 10:38:44 AM
作者:zozoh
鸭子法则
如果它走路像鸭子,说话像鸭子,样子像鸭子,叫声也像鸭子,那它就是一只鸭子。
对于 Nutz Ioc 来说,它面对的配置文件就是层层嵌套的 "名值对集合",或者说是 Map 集合。事实上,它是先把整个配置文件解析成 Map 再做判断的。
如果一个 Map 仅包括如下的键,则被认为是一个注入对象:
type | 对象类型 |
singleton | 是否单例 |
scope | 生命周期范围 |
events | 监听事件 |
args | 构造函数参数 |
fields | 字段设定 |
factory | 工厂方法 |
否则,这个 Map 被认为,是在声明对象的每个字段。
匿名对象
如果,一个字段的值就是这样一个 “鸭子 Map” 呢? 那么,自然会被认为是另外一个对象。这个对象没有名字,你不能通过 Ioc 接口直接获得,它隐藏在某个对象的某个字段里面。所以我们称这个对象为 匿名对象
匿名对象,没有所谓的单例,你声明了 singleton: true 也没有用。如果它的宿主是单例,它自然也只会被创建一次。否则,每次宿主被创建的时候,它都会被创建。
JSON 配置文件:
var ioc = {
xb : {
name : 'XiaoBai',
// 请注意,在这里, friend 字段,直接声明了另外一个对象
friend : {
type : 'nutz.demo.ioc.book.Pet',
fields : {
name : 'XiaoHei'
}
}
}
}
调用代码
Ioc ioc = new NutIoc(new JsonLoader("nutz/demo/ioc/book/inner.js"));
Pet pet = ioc.get(Pet.class, "xb");
System.out.println(pet.getFriend().getName());
ioc.depose();
控制台输出
XiaoHei
JSON 加载器
从上面的例子代码可以看出来,Nutz 的Ioc实现需要你提供一个加载器给它。
Ioc ioc = new NutIoc(new JsonLoader("nutz/demo/ioc/book/inner.js"));
^
+----- 这里你提供了一个加载器
你这个加载器是怎么实现的 NutIoc 并不关心。在 Nutz 最早的版本,它提供的第一个加载器就是 JsonLoader。
对于 JsonLoader 更多的描述,请参看 配置文件的格式
工厂方法
语法:
{
type : "net.wendal.nutzbook.Cache",
args : ["user_profile_cache"],
factory:"xxx.xx.xxxxCacheFactory#create"
}
其中 xxx.xx.xxxxFactory是工厂类的类全名, create是工厂方法, 其参数是"user_profile_cache"
从1.b.53开始,支持ioc bean做factory bean
{
type : "net.wendal.nutzbook.Cache",
args : ["user_profile_cache"],
factory:"$beanCacheFactory#create"
}
其中的beanCacheFactory是另外一个ioc bean的名称, create是工程方法的名字, 参数列表需要与args一致
生命周期范围
默认的scope是app, 与ioc容器共存亡. 可选的还有request和session, 已经很少很少使用,且仅限于子模块类及其依赖的对象.
一般情况下,不需要也不应该设置scope的值.
本页面的文字允许在知识共享 署名-相同方式共享 3.0协议和GNU自由文档许可证下修改和再使用。