Package org.nutz.ioc.weaver

Examples of org.nutz.ioc.weaver.DefaultWeaver


      op.setDepose(createTrigger(mirror, iocEventSet.getDepose()));
    }

    try {
      // 准备对象的编织方式
      DefaultWeaver dw = new DefaultWeaver();
      op.setWeaver(dw);

      // 为编织器设置事件触发器:创建时
      if (null != iobj.getEvents()) {
        dw.setCreate(createTrigger(mirror, iocEventSet.getCreate()));
      }

      // 构造函数参数
      ValueProxy[] vps = new ValueProxy[Lang.length(iobj.getArgs())];
      for (int i = 0; i < vps.length; i++)
        vps[i] = ing.makeValue(iobj.getArgs()[i]);
      dw.setArgs(vps);

      // 先获取一遍,根据这个数组来获得构造函数
      Object[] args = new Object[vps.length];
      for (int i = 0; i < args.length; i++)
        args[i] = vps[i].get(ing);

      // 缓存构造函数
      dw.setBorning((Borning<?>) mirror.getBorning(args));

      // 如果这个对象是容器中的单例,那么就可以生成实例了
      // 这一步非常重要,它解除了字段互相引用的问题
      Object obj = null;
      if (iobj.isSingleton()) {
        obj = dw.born(ing);
        op.setObj(obj);
      }

      // 获得每个字段的注入方式
      FieldInjector[] fields = new FieldInjector[iobj.getFields().length];
      for (int i = 0; i < fields.length; i++) {
        IocField ifld = iobj.getFields()[i];
        try {
          ValueProxy vp = ing.makeValue(ifld.getValue());
          fields[i] = FieldInjector.create(mirror, ifld.getName(), vp);
        }
        catch (Exception e) {
          throw Lang.wrapThrow(e, "Fail to eval Injector for field: '%s'", ifld.getName());
        }
      }
      dw.setFields(fields);

      // 如果是单例对象,前面已经生成实例了,在这里需要填充一下它的字段
      if (null != obj)
        dw.fill(ing, obj);

      // 对象创建完毕,如果有 create 事件,调用它
      dw.onCreate(obj);

    }
    // 当异常发生,从 context 里移除 ObjectProxy
    catch (Throwable e) {
      ing.getContext().remove(iobj.getScope(), ing.getObjectName());
View Full Code Here


            op.setDepose(createTrigger(mirror, iocEventSet.getDepose()));
        }

        try {
            // 准备对象的编织方式
            DefaultWeaver dw = new DefaultWeaver();
            op.setWeaver(dw);

            // 为编织器设置事件触发器:创建时
            if (null != iobj.getEvents()) {
                dw.setCreate(createTrigger(mirror, iocEventSet.getCreate()));
            }

            // 构造函数参数
            ValueProxy[] vps = new ValueProxy[Lang.length(iobj.getArgs())];
            for (int i = 0; i < vps.length; i++)
                vps[i] = ing.makeValue(iobj.getArgs()[i]);
            dw.setArgs(vps);

            // 先获取一遍,根据这个数组来获得构造函数
            Object[] args = new Object[vps.length];
            for (int i = 0; i < args.length; i++)
                args[i] = vps[i].get(ing);

            // 缓存构造函数
            dw.setBorning((Borning<?>) mirror.getBorning(args));

            // 如果这个对象是容器中的单例,那么就可以生成实例了
            // 这一步非常重要,它解除了字段互相引用的问题
            Object obj = null;
            if (iobj.isSingleton()) {
                obj = dw.born(ing);
                op.setObj(obj);
            }

            // 获得每个字段的注入方式
            FieldInjector[] fields = new FieldInjector[iobj.getFields().length];
            for (int i = 0; i < fields.length; i++) {
                IocField ifld = iobj.getFields()[i];
                try {
                    ValueProxy vp = ing.makeValue(ifld.getValue());
                    fields[i] = FieldInjector.create(mirror, ifld.getName(), vp);
                }
                catch (Exception e) {
                    throw Lang.wrapThrow(e, "Fail to eval Injector for field: '%s'", ifld.getName());
                }
            }
            dw.setFields(fields);

            // 如果是单例对象,前面已经生成实例了,在这里需要填充一下它的字段
            if (null != obj)
                dw.fill(ing, obj);

            // 对象创建完毕,如果有 create 事件,调用它
            dw.onCreate(obj);

        }
        // 当异常发生,从 context 里移除 ObjectProxy
        catch (Throwable e) {
            ing.getContext().remove(iobj.getScope(), ing.getObjectName());
View Full Code Here

            op.setDepose(createTrigger(mirror, iocEventSet.getDepose()));
        }

        try {
            // 准备对象的编织方式
            DefaultWeaver dw = new DefaultWeaver();
            op.setWeaver(dw);

            // 为编织器设置事件触发器:创建时
            if (null != iobj.getEvents()) {
                dw.setCreate(createTrigger(mirror, iocEventSet.getCreate()));
            }

            // 构造函数参数
            ValueProxy[] vps = new ValueProxy[Lang.length(iobj.getArgs())];
            for (int i = 0; i < vps.length; i++)
                vps[i] = ing.makeValue(iobj.getArgs()[i]);
            dw.setArgs(vps);

            // 先获取一遍,根据这个数组来获得构造函数
            Object[] args = new Object[vps.length];
            boolean hasNullArg = false;
            for (int i = 0; i < args.length; i++) {
                args[i] = vps[i].get(ing);
                if (args[i] == null) {
                    hasNullArg = true;
                }
            }

            // 缓存构造函数
            if (iobj.getFactory() != null) {
                // factory这属性, 格式应该是 类名#方法名
                String[] ss = iobj.getFactory().split("#", 2);
                Mirror<?> mi = Mirror.me(Lang.loadClass(ss[0]));

                if (hasNullArg) {
                    Method m = (Method) Lang.first(mi.findMethods(ss[1],args.length));
                    if (m == null)
                      throw new IocException("Factory method not found --> ", iobj.getFactory());
                    dw.setBorning(new MethodCastingBorning<Object>(m));
                } else {
                    Method m = mi.findMethod(ss[1], args);
                    dw.setBorning(new MethodBorning<Object>(m));
                }

            } else {
                dw.setBorning((Borning<?>) mirror.getBorning(args));
            }

            // 如果这个对象是容器中的单例,那么就可以生成实例了
            // 这一步非常重要,它解除了字段互相引用的问题
            Object obj = null;
            if (iobj.isSingleton()) {
                obj = dw.born(ing);
                op.setObj(obj);
            }

            // 获得每个字段的注入方式
            FieldInjector[] fields = new FieldInjector[iobj.getFields().length];
            for (int i = 0; i < fields.length; i++) {
                IocField ifld = iobj.getFields()[i];
                try {
                    ValueProxy vp = ing.makeValue(ifld.getValue());
                    fields[i] = FieldInjector.create(mirror, ifld.getName(), vp, ifld.isOptional());
                }
                catch (Exception e) {
                  throw Lang.wrapThrow(e, "Fail to eval Injector for field: '%s'", ifld.getName());
                }
            }
            dw.setFields(fields);

            // 如果是单例对象,前面已经生成实例了,在这里需要填充一下它的字段
            if (null != obj)
                dw.fill(ing, obj);

            // 对象创建完毕,如果有 create 事件,调用它
            dw.onCreate(obj);

        }
        // 当异常发生,从 context 里移除 ObjectProxy
        catch (Throwable e) {
            ing.getContext().remove(iobj.getScope(), ing.getObjectName());
View Full Code Here

TOP

Related Classes of org.nutz.ioc.weaver.DefaultWeaver

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.