use of org.nutz.lang.util.LifeCycle in project nutz by nutzam.
the class NutIoc method get.
public <T> T get(Class<T> type, String name, IocContext context) throws IocException {
if (log.isDebugEnabled())
log.debugf("Get '%s'<%s>", name, type == null ? "" : type);
try {
if (this.mirrors instanceof LifeCycle)
((LifeCycle) this.mirrors).init();
} catch (Exception e) {
throw new IocException("_mirror_factory_init", e, "Mirror Factory init fail");
}
// 创建对象创建时
IocMaking ing = makeIocMaking(context, name);
IocContext cntx = ing.getContext();
// 从上下文缓存中获取对象代理
ObjectProxy op = cntx.fetch(name);
// 如果未发现对象
if (null == op) {
// 线程同步
synchronized (lock_get) {
// 再次读取
op = cntx.fetch(name);
// 如果未发现对象
if (null == op) {
try {
if (log.isDebugEnabled())
log.debug("\t >> Load definition name=" + name);
// 读取对象定义
IocObject iobj = loader.load(createLoading(), name);
if (null == iobj) {
for (String iocBeanName : loader.getName()) {
// 感觉没必要..没有就没有呗
if (3 > LevenshteinDistance.computeLevenshteinDistance(name.toLowerCase(), iocBeanName.toLowerCase())) {
throw new IocException(name, "Undefined object '%s' but found similar name '%s'", name, iocBeanName);
}
}
throw new IocException(name, "Undefined object '%s'", name);
}
// 修正对象类型
if (null == iobj.getType())
if (null == type && Strings.isBlank(iobj.getFactory()))
throw new IocException(name, "NULL TYPE object '%s'", name);
else
iobj.setType(type);
// 检查对象级别
if (Strings.isBlank(iobj.getScope()))
iobj.setScope(defaultScope);
// 根据对象定义,创建对象,maker 会自动的缓存对象到 context 中
if (log.isDebugEnabled())
log.debugf("\t >> Make...'%s'<%s>", name, type == null ? "" : type);
op = maker.make(ing, iobj);
}// 处理异常
catch (IocException e) {
((IocException) e).addBeanNames(name);
throw e;
} catch (Throwable e) {
throw new IocException(name, e, "For object [%s] - type:[%s]", name, type == null ? "" : type);
}
}
}
}
synchronized (lock_get) {
T re = op.get(type, ing);
if (!name.startsWith("$") && re instanceof IocLoader) {
loader.addLoader((IocLoader) re);
}
return re;
}
}
Aggregations