2010-02-05 15 views
7

Tengo una aplicación basada en Spring Framework que utiliza un archivo de propiedades externo para cosas como cadena de host de base de datos, nombre de usuario y contraseña para que podamos verificar el archivo de configuración en nuestro repositorio (es de código abierto) y no comprometer la seguridad de el db. También es genial porque los desarrolladores pueden conservar su propia copia de este archivo y la aplicación usará automáticamente la configuración en su sistema en lugar de tener que volver a configurarla manualmente.¿Es posible especificar un nombre de clase para Spring Framework en un archivo externo?

Me gustaría poder especificar un bean de la misma manera. Estamos trabajando con algunas clases que podrían cambiar de desarrollador a desarrollador y sería genial si pudiéramos permitirles especificar esta información en un archivo diferente para que no tengan que meterse con el archivo de configuración principal.

Para dar una idea, tenemos algo así como

<property name="url"> 
    <value>${db.host}</value> 
</property> 

Dónde db.host se especifica en otro archivo. Lo que queremos es algo así como

<bean name="ourBean" class="${class.weneed}" /> 

La sintaxis anterior no funciona realmente, pero eso demuestra lo que queremos hacer.

¡Gracias de antemano!

Chris

Respuesta

7

Puede utilizar un FactoryBean para esto. Este ejemplo es una FactoryBean que se aprovecha de la capacidad de la primavera para emitir un nombre de clase a un objeto de Class al inyectar propiedades:

public class MyFactoryBean extends AbstractFactoryBean { 

    private Class targetClass; 

    public void setTargetClass(Class targetClass) { 
     this.targetClass = targetClass; 
    } 

    @Override 
    protected Object createInstance() throws Exception { 
     return targetClass.newInstance(); 
    } 

    @Override 
    public Class getObjectType() { 
     return targetClass; 
    } 

} 

Y entonces:

<bean name="ourBean" class="com.xyz.MyFactoryBean"> 
    <property name="targetClass" value="${class.weneed}"/> 
</bean> 

El contexto resorte ahora tienen un bean llamado ourBean que es un objeto del tipo ${class.weneed}

+1

impresionante, eso es exactamente lo que "Hacerlo requiere";) Echaré un vistazo a eso lo antes posible y te llamaré. ¡Gracias! –

0

otra opción podría ser usar cocoon-spring-configurator, que es parte del marco Cocoon, pero se puede usar solo t depende de cualquier otra cosa de capullo.
usamos esto para muchas de nuestras aplicaciones web. la idea general es configurar la fábrica de bean en función de un modo en ejecución.
le permite sustituir fácilmente/sobreescribir propiedades, pero también anular las definiciones completas de bean.
un caso de uso común es definir los beans que utiliza la aplicación y luego tener algunos archivos de configuración adicionales (que nunca se controlan en el control de código fuente) para anular algunos beans para simular una parte de la aplicación.

0

encontré que haba creado a través de la reflexión no es la primavera adecuado frijol (no registradas en su contexto primavera y no hay propiedades inicializadas), por lo que aquí es pequeña mejora:

@Override 
protected Object createInstance() throws Exception { 
    AutowireCapableBeabFactory beanFactory = (AutowireCapableBeabFactory) getBeanFactory(); 
    return beanFactory.createBean(this.targetClass); 
} 
Cuestiones relacionadas