2009-10-07 9 views
7

Tengo un archivo XML contexto de la primavera con estecontexto primavera configuración de la propiedad placholder ehcahe

<context:property-placeholder location="classpath:cacheConfig.properties"/> 

<bean id="cacheManager" 
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
    <property name="cacheManagerName" value="cacheName"/> 
    <property name="shared" value="false"/> 
    <property name="configLocation" value="classpath:cacheConfig.xml"/> 
</bean> 

el objetivo es que el cliente pueda editar el archivo de propiedades, como este

cache.maxMemoryElements="2000" 

y luego en el archivo cacheConfig.xml real tiene este

<cache name="someCacheName" 
    maxElementsInMemory="${cache.maxMemoryElements}" ... /> 

por lo que los elementos que no queremos que el cliente ange no están expuestos. Por supuesto, los detalles anteriores solo se detallan parcialmente y NO funcionan. Actualmente veo esto en el archivo de registro

Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: Error configuring from input stream. Initial cause was null:149: Could not set attribute "maxElementsInMemory". 

Gracias de antemano ...

Respuesta

12

Su ejemplo utiliza EhCacheManagerFactoryBean para exponer una referencia al CacheManager, con cachés definidos en el archivo externo cacheConfig.xml. Como señaló @ ChssPly76, el solucionador de propiedades de Spring solo funciona dentro de los propios archivos de definición de bean de Spring.

Sin embargo, usted no tiene que definir las cachés individuales en el archivo externo, puede definirlos derecha dentro del archivo de definición de frijol de primavera, utilizando EhCacheFactoryBean:

FactoryBean que crea un llamado EHCache caché ejemplo ... Si el especificada caché con nombre no es configurado en el descriptor de configuración de la caché , esto será FactoryBean construir una instancia de una caché con el nombre proporcionado y las propiedades de caché especificados y añadirlo a la CacheManager para recuperación posterior.

En otras palabras, si se utiliza EhCacheFactoryBean para referirse a una caché con nombre que no esté definido en cacheConfig.xml, a continuación, la primavera va a crear y configurar una nueva instancia caché y registrarlo con el CacheManager en tiempo de ejecución.Esto incluye especificar cosas como maxElementsInMemory, y debido a esto se especifica en el archivo de definición de frijol de primavera, se obtiene el apoyo total de la resolución de la propiedad:

<context:property-placeholder location="classpath:cacheConfig.properties"/> 

<bean id="myCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> 
    <property name="cacheManager" ref="cacheManager"/> 
    <property name="maxElementsInMemory" value="${cache.maxMemoryElements}"/> 
</bean> 

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
    <property name="shared" value="false"/> 
    <property name="configLocation" value="classpath:cacheConfig.xml"/> 
</bean> 
+0

Gracias! Eso me supera lo suficiente como para llegar al punto que me gustaría. –

+3

¿Qué sucede si quiere configurar algo que no es un caché? Por ejemplo, una propiedad de cacheManagerPeerListenerFactory? –

3

no es así como funciona PropertyPlaceholderConfigurer. Se puede usar para reemplazar los valores dentro del contexto, pero no dentro de archivos externos arbitrarios. Y cacheConfig.xml es un archivo externo, simplemente está siendo pasado por Spring a EH Cache.

2

Si está utilizando Maven o Ant, ambos ofrecen la posibilidad de filtrar los tokens en los archivos de recursos.

Para Maven, que podría hacer algo como

<cache name="someCacheName" 
    maxElementsInMemory="${cache.maxMemoryElements}" ... /> 

Y en un archivo de filtro, o en el propio POM, ha

cache.maxMemoryElements = 200 

Resource Filtering in Maven: The Definitive Guide

con la hormiga, que hacer esto con FilterSets y la tarea <copy>.

+1

+1, pero lo importante a tener en cuenta aquí es que con el reemplazo de propiedad Ant y Maven ocurre durante ** tiempo de compilación ** en comparación con el marcador de posición de propiedad de Spring donde ocurre durante el tiempo de ejecución. – ChssPly76

+0

Sí, gran punto –

2

Para cualquier persona que necesite modificar la ruta diskstore que no se puede establecer como el ehcache javadoc establece que se ignora el parámetro del almacén de discos, puede crear su propia implementación de un EhCacheManagerFactoryBean, que le permite inyectar la ruta del almacén de discos; que básicamente necesita para interceptar la creación de la CacheManager y modificar la configuración pasado a lo largo de la utilización de su propiedad diskstore, por ejemplo:

private String diskStorePath; 

...getter/setter 


public void afterPropertiesSet() throws IOException, CacheException { 
    if (this.shared) { 
     // Shared CacheManager singleton at the VM level. 
     if (this.configLocation != null) { 
      this.cacheManager = CacheManager.create(this.createConfig()); 
     } 
     else { 
      this.cacheManager = CacheManager.create(); 
     } 
    } 
    else { 
     // Independent CacheManager instance (the default). 
     if (this.configLocation != null) { 
      this.cacheManager = new CacheManager(this.createConfig()); 
     } 
     else { 
      this.cacheManager = new CacheManager(); 
     } 
    } 
    if (this.cacheManagerName != null) { 
     this.cacheManager.setName(this.cacheManagerName); 
    } 
} 

private Configuration createConfig() throws CacheException, IOException { 
    Configuration config = ConfigurationFactory.parseConfiguration(this.configLocation.getInputStream()); 

    DiskStoreConfiguration diskStoreConfiguration = config.getDiskStoreConfiguration(); 
    if (diskStoreConfiguration == null) { 
     DiskStoreConfiguration diskStoreConfigurationParameter = new DiskStoreConfiguration(); 
     diskStoreConfigurationParameter.setPath(getDiskStorePath()); 
     config.addDiskStore(diskStoreConfigurationParameter); 
    } else { 
     diskStoreConfiguration.setPath(getDiskStorePath()); 
    } 

    return config; 
} 

La configuración de la primavera tendrá el aspecto siguiente:

<bean id="cacheManager" class="com.yourcompany.package.MyEhCacheManagerFactoryBean" depends-on="placeholderConfig"> 
    <property name="diskStorePath" value="${diskstore.path}"/> 
    <property name="configLocation" value="classpath:ehcache.xml" /> 
</bean> 
+0

solo para agregar a esto una publicación útil: si necesita acceder a una propiedad jndi, puede configurarla mediante: Martin

Cuestiones relacionadas