nutz中ioc的Json配置文件格式

最近学习了下nutz ,感觉很不错,入门第一步肯定是Hello world。我在学ioc的Hello world 的时报了个警告:

log4j: 2012-02-27 23:19:38,366 [main] WARN  org.nutz.ioc.IocLoading - Using *Declared* ioc-define (without type or events)!!! Pls use Standard Ioc-Define!! Bean will define as:
{
   "singleton" :true,
   "args" :[],
   "fields" :[{
      "name" :"name",
      "value" :{
         "type" :"normal",
         "value" :"XiaoBai"
      }
   }, {
      "name" :"birthday",
      "value" :{
         "type" :"normal",
         "value" :"2009-10-25 15:23:40"
      }
   }]
}

    警告的意思是“使用了声明式的ioc定义,请使用标准的ioc定义”,那么什么是标准的ioc定义呢,Hello world 的下一节匿名对象 就说了:如果配置文件解析成map后的键值仅包含“type、scope、singleton、fields、args、events”中的一个或几个字段,就是个标准的ioc定义。

 

报之上的警告是因为在ioc的配置文件中,使用了:

xiaobai : {
        name : 'XiaoBai',
        birthday : '2009-10-25 15:23:40'
}

 这样,name和birthday就会被当作map的键值,它们不包含在“type、scope、singleton、fields、args、events”之内。

可以修改为:

xiaobai : {
	fields : {
		name : 'XiaoBai',
		birthday : '2009-10-25 15:23:40'
	}
}

 这样的话,fields就是会成为解析后map的键值,就不会报开始的那个警告。

 

我跟了下代码,在nutz-1.b.42.jar(我使用的是这个版本)org.nutz.ioc包里面的Iocs虚拟类中(应该作为工具类,防止实例化才定义为虚拟类的,不过这种可以直接把其默认构造器私有化来实现,不用搞个虚拟类)有个方法就是用来检测是否为标准的ioc定义。

/**
 * @author zozoh(zozohtnt@gmail.com)
 * @author wendal(wendal1985@gmail.com)
 * 
 */
public abstract class Iocs {

	private static final String OBJFIELDS = "^(type|scope|singleton|fields|args|events)$";

	public static boolean isIocObject(Map<String, ?> map) {
		for (Entry<String, ?> en : map.entrySet())
			if (!en.getKey().matches(OBJFIELDS))
				return false;
		return true;
	}
        // 此处省略其他方法
}

 意思很明白,和以上所说的一样,如果map的key不包含在"type|scope|singleton|fields|args|events"中就返回false。在同一个包下的IocLoading类的map2iobj方法有如下判断:

@SuppressWarnings("unchecked")
public IocObject map2iobj(Map<String, Object> map) throws ObjectLoadException {
	final IocObject iobj = new IocObject();
	if (!isIocObject(map)) {
		for (Entry<String, Object> en : map.entrySet()) {
			IocField ifld = new IocField();
			ifld.setName(en.getKey());
			ifld.setValue(object2value(en.getValue()));
			iobj.addField(ifld);
		}
		if(log.isWarnEnabled()) //TODO 移除这种兼容性
			log.warn("Using *Declared* ioc-define (without type or events)!!! Pls use Standard Ioc-Define!!" +
						" Bean will define as:\n"+Json.toJson(iobj));
	}// 此处省略其他代码
}

 开始的WARN就是这打出来的。

 

这个应该是历史遗留问题,作者也不推荐使用了,所以还是按标准的来。不过也相当简单,就那几个字段,照着配好就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值