Solo necesita algo evaluado por la comunidad. Lo que sigue es un fragmento de código, que es una fábrica simple que crea instancias de un tipo particular. El método registrará el bean en el contexto como un prototipo y devolverá la instancia. Esta es la primera vez que configuro beans en tiempo de ejecución. ¿Podría amablemente evaluar y proporcionar comentarios? gracias de antemano.Registro de beans (prototipo) en tiempo de ejecución en Spring
package au.com.flexcontacts.flexoperations;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.AbstractApplicationContext;
import au.com.flexcontacts.exceptions.SyncClassCreactionError;
/**
* @author khushroo.mistry
* Class purpose: Simple Factory to create an
* instance of SynchroniseContactsService and register it in the Spring IoC.
*/
public final class FLEXSyncFactory implements ApplicationContextAware {
private static AbstractApplicationContext context;
/**
* @param username
* @param password
* @param syncType
* @return the correct service class
* @throws SyncClassCreactionError
* The method registers the classes dynamically into the Spring IoC
*/
public final SynchroniseContactsService createSyncService(String username, String password, SyncType syncType) throws SyncClassCreactionError {
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) context.getBeanFactory();
try {
//Register the bean in the IoC
BeanDefinition bdb = new GenericBeanDefinition();
bdb.setBeanClassName(syncType.getClassName());
bdb.setScope("prototype");
ConstructorArgumentValues constructor = bdb.getConstructorArgumentValues();
constructor.addIndexedArgumentValue(0, username);
constructor.addIndexedArgumentValue(1, password);
beanFactory.registerBeanDefinition(syncType.getInstanceName(), bdb);
//Return instance of bean
return (SynchroniseContactsService) beanFactory.getBean(syncType.getInstanceName());
} catch (Exception e) {
e.printStackTrace();
throw new SyncClassCreactionError("Error: Illegal Handler");
}
}
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
context = (AbstractApplicationContext) applicationContext;
}
}
FLEX Sync factory se ha configurado en el contenedor IoC como singleton. Entonces para crear un nuevo administrador de sincronización hago lo siguiente:
flexSyncFactory.createSyncService(userName, password, SyncType.FULL);
Estoy usando Spring 3.1. Por favor revise y brinde sus valiosos comentarios.
saludos cordiales.
He descartado este enfoque como yo pensaba que era un poco arriesgado. Acabo de utilizar fábricas y reflejos simples para generar estos granos. Estos granos no necesitan registrarse en el contenedor de primavera. También investigaré la anotación @ Configuarable. Gracias por evaluar mi enfoque. Lo aprecio. – Khush
@Biju Kunjummen Soy principiante en primavera, así que corrígeme si me equivoco. Hablo de la frase: 'Spring no proporciona ninguna otra forma nativa para agregar dinámicamente definiciones de beans o instancias de beans en tiempo de ejecución'. ¿Qué pasa con 'StaticApplicationContext' que le permite agregar beans en tiempo de ejecución y está utilizando en la arquitectura de plug-in? Además, ¿qué pasa con Custom 'BeanDefinitionReader' mencionado en la referencia http://www.carlobonamico.com/blog/?p=55? –