package org.nutz.ioc; import org.nutz.lang.Lang; /** * 每次获取对象时会触发 fetch 事件,销毁时触发 depose 事件。 * <p> * 这个对象需要小心被创建和使用。为了防止循环注入的问题,通常,ObjectMaker 需要快速<br> * 创建一个 ObjectProxy, 存入上下文。 然后慢慢的设置它的 weaver 和 fetch。 * <p> * 在出现异常的时候,一定要将该对象从上下文中移除掉。 * * @author zozoh(zozohtnt@gmail.com) */ public class ObjectProxy { /** * 存储动态编织对象的方法 */ private ObjectWeaver weaver; /** * 存储静态对象 */ private Object obj; /** * 获取时触发器 */ private IocEventTrigger<Object> fetch; /** * 销毁时触发器。如果有静态对象被销毁,触发 */ private IocEventTrigger<Object> depose; public ObjectProxy() { } public ObjectProxy(Object obj) { this.obj = obj; } public ObjectProxy setWeaver(ObjectWeaver weaver) { this.weaver = weaver; return this; } public ObjectProxy setObj(Object obj) { this.obj = obj; return this; } public ObjectProxy setFetch(IocEventTrigger<Object> fetch) { this.fetch = fetch; return this; } public ObjectProxy setDepose(IocEventTrigger<Object> depose) { this.depose = depose; return this; } @SuppressWarnings("unchecked") public <T> T get(Class<T> classOfT, IocMaking ing) { Object re; if (null != obj) re = obj; else if (null != weaver) re = weaver.onCreate(weaver.fill(ing, weaver.born(ing))); else throw Lang.makeThrow("NullProxy for '%s'!", ing.getObjectName()); if (null != fetch) fetch.trigger(re); return (T) re; } public void depose() { if (null != obj && null != depose) depose.trigger(obj); } }