如何定义对象

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 配置文件:

  1. var ioc = {
  2. xb : {
  3. name : 'XiaoBai',
  4. // 请注意,在这里, friend 字段,直接声明了另外一个对象
  5. friend : {
  6. type : 'nutz.demo.ioc.book.Pet',
  7. fields : {
  8. name : 'XiaoHei'
  9. }
  10. }
  11. }
  12. }

调用代码

  1. Ioc ioc = new NutIoc(new JsonLoader("nutz/demo/ioc/book/inner.js"));
  2. Pet pet = ioc.get(Pet.class, "xb");
  3. System.out.println(pet.getFriend().getName());
  4. ioc.depose();

控制台输出

  1. XiaoHei

JSON 加载器

从上面的例子代码可以看出来,Nutz 的Ioc实现需要你提供一个加载器给它。

  1. Ioc ioc = new NutIoc(new JsonLoader("nutz/demo/ioc/book/inner.js"));
  2. ^
  3. +----- 这里你提供了一个加载器

你这个加载器是怎么实现的 NutIoc 并不关心。在 Nutz 最早的版本,它提供的第一个加载器就是 JsonLoader。

对于 JsonLoader 更多的描述,请参看 配置文件的格式

工厂方法

语法:

  1. {
  2. type : "net.wendal.nutzbook.Cache",
  3. args : ["user_profile_cache"],
  4. factory:"xxx.xx.xxxxCacheFactory#create"
  5. }

其中 xxx.xx.xxxxFactory是工厂类的类全名, create是工厂方法, 其参数是"user_profile_cache"

从1.b.53开始,支持ioc bean做factory bean

  1. {
  2. type : "net.wendal.nutzbook.Cache",
  3. args : ["user_profile_cache"],
  4. factory:"$beanCacheFactory#create"
  5. }

其中的beanCacheFactory是另外一个ioc bean的名称, create是工程方法的名字, 参数列表需要与args一致

生命周期范围

默认的scope是app, 与ioc容器共存亡. 可选的还有request和session, 已经很少很少使用,且仅限于子模块类及其依赖的对象.

一般情况下,不需要也不应该设置scope的值.

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/ioc/inner_object.html