如何定义对象

优质
小牛编辑
135浏览
2023-12-01

如果它走路像鸭子,说话像鸭子,样子像鸭子,叫声也像鸭子,那它就是一只鸭子。

对于 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的值.