2012-04-27 9 views

Respuesta

10

Si bien es posible call arbitrary methods in Spring XML using the factory-method attribute, descubrirá que es casi imposible para las llamadas encadenadas estilo Builder-Pattern.

En su lugar, utilice un FactoryBean o Java-based container configuration para escenarios tan complejos. XML no te llevará tan lejos, me temo.

+0

Gracias - ¡Lo tengo funcionando a través de FactoryBean! – kuriouscoder

+0

@kuriouscoder podría compartir su fragmento, estoy en el mismo barco, gracias! –

+0

Si prefiere usar la configuración de Java, hay un ejemplo completo de esta pregunta: http://stackoverflow.com/questions/8181768/can-i-set-a-ttl-for-cacheable/31926759#31926759 – anataliocs

18

Con la adición de CacheBuilderSpec en la próxima versión de guayaba (versión 12), podrás crear un grano CacheBuilder en XML, utilizando el método de fábrica estática CacheBuilder.from(String spec).

Se vería así:

<bean id="legendaryCacheBuilder" 
     class="com.google.common.cache.CacheBuilder" 
     factory-method="from"> 
    <constructor-arg value="maximumSize=42, expireAfterAccess=10m, expireAfterWrite=1h" /> 
</bean> 

Incluso se puede externalizar la cadena de configuración en un archivo .properties, usando la primavera de PropertyPlaceholderConfigurer.

Hasta entonces, debe usar la solución de Sean Patrick Floyd (que también tiene la ventaja de ser segura).

2

También quería agregar que puede usar la especificación de caché directamente en el Administrador de caché si no está interesado en diferentes constructores de caché para diferentes cachés.

No es necesario que especifique cada caché por nombre al inicializar el Administrador de caché, cada nueva solicitud de caché creará uno basado en el CacheBuilder proporcionado, o en este caso con la especificación de caché proporcionada (que da como resultado correspondiente CacheBuilder).

Eres XML Spring termina siendo muy elegante:

<bean id="cacheManager" class="org.springframework.cache.guava.GuavaCacheManager"> 
    <property name="cacheSpecification" value="maximumSize=300000,expireAfterWrite=10h" /> 
</bean> 

también NOTA: no se olvide de decirle a la primavera que está utilizando el almacenamiento en caché mediante la inclusión de algo como esto en su aplicación de configuración xml:

<cache:annotation-driven/> 

¿Qué tendrá que definir por supuesto:

xmlns:cache="http://www.springframework.org/schema/cache" 
xsi:schemaLocation="http://www.springframework.org/schema/cache classpath:org/springframework/cache/config/spring-cache-4.2.xsd" 

Si usted no está haciendo algo tan simple como este y si desea tener múltiples CacheBuilders para diferentes casos de uso, entonces probablemente quiera crear su propia clase y método de fábrica.

Cuestiones relacionadas