package org.nutz.ioc.weaver; import org.nutz.ioc.IocMaking; import org.nutz.ioc.ValueProxy; import org.nutz.lang.Mirror; import org.nutz.lang.inject.Injecting; import org.nutz.log.Log; import org.nutz.log.Logs; public class FieldInjector { private static final Log log = Logs.get(); public static FieldInjector create(Mirror<?> mirror, String fieldName, ValueProxy vp, boolean optional) { FieldInjector fi = new FieldInjector(); fi.valueProxy = vp; fi.inj = mirror.getInjecting(fieldName); fi.optional = optional; fi.fieldName = fieldName; return fi; } private ValueProxy valueProxy; private Injecting inj; private boolean optional; private String fieldName; private FieldInjector() {} void inject(IocMaking ing, Object obj) { try { Object value = valueProxy.get(ing); inj.inject(obj, value); } catch (Throwable e) { if (optional) { log.info("field inject fail, but this field is optional, ignore error", e); return; } String msg = String.format("IocBean[%s] fail at field=[%s]", ing.getObjectName(), fieldName); throw new RuntimeException(msg, e); } } }