package org.nutz.ioc.loader.properties; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.nutz.ioc.IocLoader; import org.nutz.ioc.IocLoading; import org.nutz.ioc.ObjectLoadException; import org.nutz.ioc.impl.PropertiesProxy; import org.nutz.ioc.meta.IocObject; import org.nutz.log.Log; import org.nutz.log.Logs; import org.nutz.mapl.Mapl; import org.nutz.mvc.adaptor.ParamExtractor; import org.nutz.mvc.adaptor.Params; import org.nutz.mvc.adaptor.injector.ObjectNaviNode; public class PropertiesIocLoader extends PropertiesProxy implements IocLoader { private static Log log = Logs.get(); protected Map<String, IocObject> objs = new HashMap<String, IocObject>(); public PropertiesIocLoader() {} public PropertiesIocLoader(String...paths) { super(paths); log.debug("beans = " + objs.keySet()); } public String[] getName() { reload(); return objs.keySet().toArray(new String[objs.size()]); } public IocObject load(IocLoading loading, String name) throws ObjectLoadException { reload(); return objs.get(name); } public boolean has(String name) { reload(); return objs.containsKey(name); } @SuppressWarnings("rawtypes") public void reload() { List<String> beanNames = new ArrayList<String>(); for (String key : keys()) { if (!key.startsWith("ioc.") || key.length() < 5) continue; String[] tmp = key.split("[.]"); if (tmp.length == 3) { if (tmp[2].equals("type") || tmp[2].equals("factory")) { beanNames.add(tmp[1]); } } } for (String beanName : beanNames) { ObjectNaviNode no = new ObjectNaviNode(); String prefix = "ioc." + beanName+"."; String pre = ""; ParamExtractor pe = Params.makeParamExtractor(null, this.toMap()); for (Object name : pe.keys()) { String na = (String) name; if (na.startsWith(prefix)) { no.put(pre + na, pe.extractor(na)); } } Object model = no.get(); Object re = Mapl.maplistToObj(((Map)model).get(beanName), IocObject.class); this.objs.put(beanName, (IocObject) re); } // 插入自身 //this.objs.put("conf", Iocs.wrap(this)); } }