2012-04-27 13 views

risposta

10

Mentre è possibile effettuare il call arbitrary methods in Spring XML using the factory-method attribute, è quasi impossibile per le chiamate concatenate in stile Builder-Pattern.

Invece, utilizzare uno FactoryBean o Java-based container configuration per tali scenari complessi. L'XML non ti porterà lontano, temo.

+0

Grazie - L'ho eseguito tramite FactoryBean! – kuriouscoder

+0

@kuriouscoder potresti condividere il tuo frammento, io sono nella stessa barca, grazie! –

+0

Se si preferisce utilizzare la configurazione Java, esiste un esempio completo su questa domanda: http://stackoverflow.com/questions/8181768/can-i-set-a-ttl-for-cacheable/31926759#31926759 – anataliocs

18

Con l'aggiunta di CacheBuilderSpec nella prossima release Guava (versione 12), sarete in grado di creare un CacheBuilder fagiolo in XML, utilizzando il metodo factory statica CacheBuilder.from(String spec).

Sarebbe simile a questa:

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

si potrebbe anche esternare la stringa di configurazione in un file .properties, utilizzando Primavera di PropertyPlaceholderConfigurer.

Fino ad allora, dovresti utilizzare la soluzione di Sean Patrick Floyd (che ha anche il vantaggio di essere sicura per i tipi).

2

Inoltre, si desidera aggiungere che è possibile utilizzare la specifica della cache direttamente in Cache Manager se non si è interessati a diversi Cache Builder per cache differenti.

Non è necessario specificare ogni cache per nome durante l'inizializzazione di Cache Manager, ogni nuova richiesta per una cache ne crea una basata sul CacheBuilder fornito, o in questo caso con la specifica cache fornita (che si traduce in un corrispondente CacheBuilder).

Sei Primavera XML finisce per essere estremamente elegante:

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

anche notare: non dimenticate di dire la primavera si sta utilizzando la cache includendo qualcosa di simile nella vostra applicazione di configurazione XML:

<cache:annotation-driven/> 

Quale sarà necessario ovviamente definire:

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" 

Se non stai facendo qualcosa di semplice come questo e tu vuoi avere più CacheBuilder per diversi casi d'uso, probabilmente vorrai creare il tuo Factory Class e Method.

Problemi correlati