package org.nutz.ioc.weaver; import org.nutz.ioc.IocEventTrigger; import org.nutz.ioc.IocMaking; import org.nutz.ioc.ObjectWeaver; import org.nutz.ioc.ValueProxy; import org.nutz.lang.born.Borning; /** * 默认的对象编织过程 * * @author zozoh(zozohtnt@gmail.com) * @author wendal(wendal1985@gmail.com) */ public class DefaultWeaver implements ObjectWeaver { /** * 对象创建时的触发器 */ private IocEventTrigger<Object> create; /** * 对象构造方法 */ private Borning<?> borning; /** * 对象构造方法参数 */ private ValueProxy[] args; /** * 字段注入器列表 */ private FieldInjector[] fields; public void setCreate(IocEventTrigger<Object> create) { this.create = create; } public void setBorning(Borning<?> borning) { this.borning = borning; } public void setArgs(ValueProxy[] args) { this.args = args; } public void setFields(FieldInjector[] fields) { this.fields = fields; } public <T> T fill(IocMaking ing, T obj) { // 设置字段的值 for (FieldInjector fi : fields) fi.inject(ing, obj); return obj; } public Object born(IocMaking ing) { // 准备构造函数参数 Object[] args = new Object[this.args.length]; for (int i = 0; i < args.length; i++) args[i] = this.args[i].get(ing); // 创建实例 Object obj = borning.born(args); return obj; } public Object onCreate(Object obj) { if (null != create && null != obj) create.trigger(obj); return obj; } }