package org.nutz.ioc.meta; import org.nutz.json.Json; /** * 描述了对象的一个值,这个值可以是构造函数的参数,也可以是一个字段的值。 * <p> * 它由两个属性,一个是值的类型,另外一个是 value。 * * <h4>赋值约定</h4><br> * * <ul> * <li>如果 type 是 "null",则值会被认为是 null * <li>如果 value 是 字符串,数字,布尔,那么 type 必须为 "normal"或 null * <li>如果 value 是 数组, Collection 或 Map,那么类型也必须是 "normal"或 null,Ioc * 容器的实现类会深层递归集合的每个元素。集合内的每个元素的值也可以是 IocValue,规则符合本约定 * <li>如果 value 是 IocObject,则表示这个值是一个内部匿名对象,type 必须为 "inner" 或者 null * <li>如果 value 是字符串,表示另外一个对象的名称,type 必须是 "refer" * <li>如果 value 是字符串,表示一个环境变量(通过System.getenv(String)),type 必须是 "env" * <li>如果 value 是字符串,表示一个系统变量(通过System.getProperties().get(String)),type 必须是 "sys" * <li>如果 value 是字符串,表示一个文件路径,type 必须是 "file" * <li>如果 value 是字符串,表示一个 Java 调用,type 必须是 "java",具体值的语法,请参看 JavaValue 类的 * JDoc,当然 Ioc 容器来解析执行它,不需要 IocLoader 操心 说明 * <li>你的 ValueProxyMaker 可以扩展这个约定 * </ul> * * @author zozoh(zozohtnt@gmail.com) * * @see org.nutz.ioc.val.JavaValue */ public class IocValue { public static final String TYPE_NORMAL = "normal"; public static final String TYPE_INNER = "inner"; public static final String TYPE_REFER = "refer"; public static final String TYPE_ENV = "env"; public static final String TYPE_SYS = "sys"; public static final String TYPE_FILE = "file"; public static final String TYPE_JAVA = "java"; public static final String TYPE_JNDI = "jndi"; public static final String TYPE_APP = "app"; private String type; private Object value; public String getType() { return type; } public void setType(String type) { this.type = type; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } @Override public String toString() { return String.format("{%s:%s}", type, Json.toJson(value)); } }