2010-08-25 14 views
5

Tengo tres aplicaciones en un proyecto administrado de Spring 2.5 que comparten algún código y difieren en los detalles.Inyectar una propiedad externa en el contexto de Spring

Cada aplicación tiene una propiedad (java.lang.String) que se utiliza antes de compilar el contexto de la aplicación.

Crear el contexto de la aplicación lleva tiempo y no puede suceder primero. Como tal, está definido en cada aplicación individual. Esta propiedad está duplicada en la definición del contexto, ya que también se necesita allí. ¿Puedo deshacerme de esa duplicación?

¿Es posible inyectar esa propiedad en el contexto de mi aplicación?

Respuesta

5

Eche un vistazo a PropertyPlaceholderConfigurer.

La documentación de Spring habla de eso here.

<bean id="myPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:my-property-file.properties"/> 
    <property name="placeholderPrefix" value="$myPrefix{"/> 
</bean> 

<bean id="myClassWhichUsesTheProperties" class="com.class.Name"> 
    <property name="propertyName" value="$myPrefix{my.property.from.the.file}"/> 
</bean> 

A continuación, tiene referencia a esa cadena en cualquier lugar que desee en su contexto de aplicación, constructor-arg, etc. property

+0

Sin embargo, no puedo usar mi, por ejemplo 'private String appName = ...', en el contexto de la aplicación como una propiedad para algunos beans, ¿o sí? – DerMike

+0

No, ya que esa es la sintaxis de Java, y el contexto de la aplicación es un archivo XML. Si tiene un archivo de propiedad y contiene la propiedad para appName, por ejemplo, 'appName = MyApp', puede referirse a' $ myPrefix {appName} 'una vez que se configure el PropertyPlaceholderConfigurer, y eso (en este caso) se resolvería a 'MyApp'. –

+0

Esperaba encontrar algo como 'ctx.addBean (String.class, appName)' en el mejor de los casos. – DerMike

3

Con la primavera 3.0 que tienen la @Value("${property}"). Utiliza los beans definidos PropertyPlaceholderConfigurer.

En la primavera de 2.5 podrá utilizar de nuevo el PropertyPlaceholderConfigurer y luego definir un grano de tipo java.lang.String que luego se puede Autowire:

<bean id="yourProperty" class="java.lang.String"> 
    <constructor-arg value="${property}" /> 
</bean> 

@Autowired 
@Qualifier("yourProperty") 
private String property; 
1

Si no quiere tratar con propiedades externas, se podría definir algunos frijol común

<bean id="parent" class="my.class.Name"/> 

entonces inicializar de alguna manera, y poner en común archivo XML primavera, digamos common.xml. Después de eso, usted puede hacer este contexto como un padre para cada uno o de sus aplicaciones - en su archivo XML contexto niño:

<import resource="common.xml"/> 

y luego se puede inyectar propiedades de su padre en los granos de los que está interesado:

<bean ... 
<property name="myProperty" value="#{parent.commonProperty}"/> 
... 
</bean> 
Cuestiones relacionadas