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

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

Introduction

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

Prototype

public AbstractBeanDefinition getBeanDefinition() 

Source Link

Usage

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/*from w  w  w  .  ja va2s  .  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;
}