Example usage for org.springframework.beans.factory.groovy GroovyBeanDefinitionWrapper GroovyBeanDefinitionWrapper

List of usage examples for org.springframework.beans.factory.groovy GroovyBeanDefinitionWrapper GroovyBeanDefinitionWrapper

Introduction

In this page you can find the example usage for org.springframework.beans.factory.groovy GroovyBeanDefinitionWrapper GroovyBeanDefinitionWrapper.

Prototype

public GroovyBeanDefinitionWrapper(String beanName, Class<?> clazz, Collection<?> constructorArgs) 

Source Link

Usage

From source file:org.springframework.beans.factory.groovy.GroovyBeanDefinitionReader.java

/**
 * Define an inner bean definition./* ww  w.  jav a2  s  .  c o m*/
 * @param type the bean type
 * @param args the constructors arguments and closure configurer
 * @return the bean definition
 */
public AbstractBeanDefinition bean(Class<?> type, Object... args) {
    GroovyBeanDefinitionWrapper current = this.currentBeanDefinition;
    try {
        Closure callable = null;
        Collection constructorArgs = null;
        if (!ObjectUtils.isEmpty(args)) {
            int index = args.length;
            Object lastArg = args[index - 1];
            if (lastArg instanceof Closure) {
                callable = (Closure) lastArg;
                index--;
            }
            if (index > -1) {
                constructorArgs = resolveConstructorArguments(args, 0, index);
            }
        }
        this.currentBeanDefinition = new GroovyBeanDefinitionWrapper(null, type, constructorArgs);
        if (callable != null) {
            callable.call(this.currentBeanDefinition);
        }
        return this.currentBeanDefinition.getBeanDefinition();

    } finally {
        this.currentBeanDefinition = current;
    }
}

From source file:org.springframework.beans.factory.groovy.GroovyBeanDefinitionReader.java

/**
 * This method is called when a bean definition node is called.
 * @param beanName the name of the bean to define
 * @param args the arguments to the bean. The first argument is the class name, the last
 * argument is sometimes a closure. All the arguments in between are constructor arguments.
 * @return the bean definition wrapper/*  w w  w .jav  a2  s.  c  o m*/
 */
private GroovyBeanDefinitionWrapper invokeBeanDefiningMethod(String beanName, Object[] args) {
    boolean hasClosureArgument = (args[args.length - 1] instanceof Closure);
    if (args[0] instanceof Class) {
        Class<?> beanClass = (Class<?>) args[0];
        if (hasClosureArgument) {
            if (args.length - 1 != 1) {
                this.currentBeanDefinition = new GroovyBeanDefinitionWrapper(beanName, beanClass,
                        resolveConstructorArguments(args, 1, args.length - 1));
            } else {
                this.currentBeanDefinition = new GroovyBeanDefinitionWrapper(beanName, beanClass);
            }
        } else {
            this.currentBeanDefinition = new GroovyBeanDefinitionWrapper(beanName, beanClass,
                    resolveConstructorArguments(args, 1, args.length));
        }
    } else if (args[0] instanceof RuntimeBeanReference) {
        this.currentBeanDefinition = new GroovyBeanDefinitionWrapper(beanName);
        this.currentBeanDefinition.getBeanDefinition()
                .setFactoryBeanName(((RuntimeBeanReference) args[0]).getBeanName());
    } else if (args[0] instanceof Map) {
        // named constructor arguments
        if (args.length > 1 && args[1] instanceof Class) {
            List constructorArgs = resolveConstructorArguments(args, 2,
                    hasClosureArgument ? args.length - 1 : args.length);
            this.currentBeanDefinition = new GroovyBeanDefinitionWrapper(beanName, (Class) args[1],
                    constructorArgs);
            Map namedArgs = (Map) args[0];
            for (Object o : namedArgs.keySet()) {
                String propName = (String) o;
                setProperty(propName, namedArgs.get(propName));
            }
        }
        // factory method syntax
        else {
            this.currentBeanDefinition = new GroovyBeanDefinitionWrapper(beanName);
            //First arg is the map containing factoryBean : factoryMethod
            Map.Entry factoryBeanEntry = (Map.Entry) ((Map) args[0]).entrySet().iterator().next();
            // If we have a closure body, that will be the last argument.
            // In between are the constructor args
            int constructorArgsTest = hasClosureArgument ? 2 : 1;
            // If we have more than this number of args, we have constructor args
            if (args.length > constructorArgsTest) {
                // factory-method requires args
                int endOfConstructArgs = (hasClosureArgument ? args.length - 1 : args.length);
                this.currentBeanDefinition = new GroovyBeanDefinitionWrapper(beanName, null,
                        resolveConstructorArguments(args, 1, endOfConstructArgs));
            } else {
                this.currentBeanDefinition = new GroovyBeanDefinitionWrapper(beanName);
            }
            this.currentBeanDefinition.getBeanDefinition()
                    .setFactoryBeanName(factoryBeanEntry.getKey().toString());
            this.currentBeanDefinition.getBeanDefinition()
                    .setFactoryMethodName(factoryBeanEntry.getValue().toString());
        }

    } else if (args[0] instanceof Closure) {
        this.currentBeanDefinition = new GroovyBeanDefinitionWrapper(beanName);
        this.currentBeanDefinition.getBeanDefinition().setAbstract(true);
    } else {
        List constructorArgs = resolveConstructorArguments(args, 0,
                hasClosureArgument ? args.length - 1 : args.length);
        currentBeanDefinition = new GroovyBeanDefinitionWrapper(beanName, null, constructorArgs);
    }

    if (hasClosureArgument) {
        Closure callable = (Closure) args[args.length - 1];
        callable.setDelegate(this);
        callable.setResolveStrategy(Closure.DELEGATE_FIRST);
        callable.call(new Object[] { currentBeanDefinition });
    }

    GroovyBeanDefinitionWrapper beanDefinition = currentBeanDefinition;
    this.currentBeanDefinition = null;
    beanDefinition.getBeanDefinition().setAttribute(GroovyBeanDefinitionWrapper.class.getName(),
            beanDefinition);
    getRegistry().registerBeanDefinition(beanName, beanDefinition.getBeanDefinition());
    return beanDefinition;
}