Manual Configuration, and existing instances
Hi,
I'm trying to configure Spring ActionScript manually (ie, without XML), but having some trouble getting existing instances into an ObjectFactory. More specifically, I'm trying to write an adapter so that I can use Spring with my current framework, and am struggling with the bindValue part. This is what I've got going so far. Any advice would be greatly appreciated.
Code:
package net.boyblack.robotlegs.adapters
{
import net.boyblack.robotlegs.core.IInjector;
import org.as3commons.reflect.ClassUtils;
import org.as3commons.reflect.Field;
import org.as3commons.reflect.MetaData;
import org.as3commons.reflect.Type;
import org.springextensions.actionscript.ioc.ObjectDefinition;
import org.springextensions.actionscript.ioc.factory.support.DefaultListableObjectFactory;
import org.springextensions.actionscript.utils.ObjectUtils;
public class SpringInjector implements IInjector
{
protected var factory:DefaultListableObjectFactory;
public function SpringInjector()
{
factory = new DefaultListableObjectFactory();
}
public function bindValue( whenAskedFor:Class, useValue:Object, named:String = null ):void
{
var whenAskedForClassName:String = ClassUtils.getFullyQualifiedName( whenAskedFor );
var useClassName:String = ObjectUtils.getFullQualifiedClassName( useValue );
var objdef:ObjectDefinition = new ObjectDefinition( useClassName );
// how to store useValue instance?
var key:String = named ? named : whenAskedForClassName;
factory.registerObjectDefinition( key, objdef );
}
public function bindClass( whenAskedFor:Class, instantiateClass:Class, named:String = null ):void
{
var whenAskedForClassName:String = ClassUtils.getFullyQualifiedName( whenAskedFor );
var useClassName:String = ClassUtils.getFullyQualifiedName( instantiateClass );
var objdef:ObjectDefinition = new ObjectDefinition( useClassName );
objdef.isSingleton = false;
var key:String = named ? named : whenAskedForClassName;
factory.registerObjectDefinition( key, objdef );
}
public function bindSingleton( whenAskedFor:Class, named:String = null ):void
{
var whenAskedForClassName:String = ClassUtils.getFullyQualifiedName( whenAskedFor );
var objdef:ObjectDefinition = new ObjectDefinition( whenAskedForClassName );
var key:String = named ? named : whenAskedForClassName;
factory.registerObjectDefinition( key, objdef );
}
public function bindSingletonOf( whenAskedFor:Class, useSingletonOf:Class, named:String = null ):void
{
var whenAskedForClassName:String = ClassUtils.getFullyQualifiedName( whenAskedFor );
var useClassName:String = ClassUtils.getFullyQualifiedName( useSingletonOf );
var objdef:ObjectDefinition = new ObjectDefinition( useClassName );
var key:String = named ? named : whenAskedForClassName;
factory.registerObjectDefinition( key, objdef );
}
public function injectInto( target:Object ):void
{
var type:Type = Type.forInstance( target );
var fields:Array = type.fields;
for each ( var field:Field in fields )
{
if ( field.hasMetaData( 'Inject' ) )
{
var named:String;
var mds:Array = field.getMetaData( 'Inject' );
for each ( var md:MetaData in mds )
{
if ( md.hasArgumentWithKey( 'name' ) )
{
named = md.getArgument( 'name' ).value;
}
else if ( md.hasArgumentWithKey( 'id' ) )
{
named = md.getArgument( 'id' ).value;
}
}
named = named ? named : field.type.fullName;
target[ field.name ] = factory.getObject( named );
}
}
}
public function unbind( clazz:Class, named:String = null ):void
{
named = named ? named : ClassUtils.getFullyQualifiedName( clazz );
factory.removeObjectDefinition( named );
}
}
}
what is the bindValue for?
Hey there,
interesting to see how you're using Spring Actionscript in your own framework :) I'm trying to find out what the bindValue() method actually does though, is this when an instance's property needs to be injected by a managed value?
cheers,
Roland