2012-04-27 2 views
13

Injizieren Kann jemand eine gute Snippet zu konstruieren und injizieren Google Guavas CacheBuilder in eine abhängige Bean über Spring XML?Google Guave Cache-Builder über Spring in

Um zu verallgemeinern, brauche ich einige Beispiele in Spring, die Konstruktion von Objekten mit Builder-Muster veranschaulicht.

Antwort

10

Während es möglich ist, call arbitrary methods in Spring XML using the factory-method attribute, Sie werden feststellen, dass es fast unmöglich für Builder-Pattern-Stil angekettete Anrufe ist.

Verwenden Sie stattdessen FactoryBean oder Java-based container configuration für solche komplexen Szenarien. XML wird dich nicht so weit bringen, fürchte ich.

+0

Danke - ich habe es über FactoryBean laufen! – kuriouscoder

+0

@kuerycoder könnten Sie Ihren Schnipsel teilen, ich bin im selben Boot, danke! –

+0

Wenn Sie die Java-Konfiguration bevorzugen, gibt es ein vollständiges Beispiel zu dieser Frage: http://stackoverflow.com/questions/8181768/can-i-set-a-tl-for-cacheable/31926759#31926759 – anataliocs

18

Mit dem Zusatz von CacheBuilderSpec im nächsten Guava Release (Release 12), werden Sie in der Lage sein, eine CacheBuilder Bohne in XML zu erstellen, die CacheBuilder.from(String spec) statische Factory-Methode.

Es würde wie folgt aussehen:

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

Sie könnten sogar die Konfigurationszeichenfolge in eine .properties-Datei externalisieren, PropertyPlaceholderConfigurer Spring verwenden.

Bis dahin sollten Sie Sean Patrick Floyds Lösung verwenden (was auch den Vorteil hat, typsicher zu sein).

2

Auch wollte hinzufügen, dass Sie die Cache-Spezifikation direkt im Cache-Manager verwenden können, wenn Sie nicht an verschiedenen Cache-Builder für verschiedene Caches interessiert sind.

Sie müssen nicht bei der Initialisierung des Cache-Managers jeden Cache nach Namen angeben. Jede neue Anforderung für einen Cache erstellt einen Cache basierend auf dem bereitgestellten CacheBuilder oder in diesem Fall mit der angegebenen Cache-Spezifikation entsprechenden CacheBuilder).

Sie sind Spring-XML endet extrem elegant zu sein:

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

Auch Hinweis: vergessen Sie nicht, Frühling, Ihnen zu sagen Caching verwenden, werden durch so etwas wie dies in Ihrer Anwendung Config xml einschließlich:

<cache:annotation-driven/> 

, die Sie natürlich benötigen definieren:

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" 

Wenn Sie nicht tun etwas so einfaches und Sie möchten mehrere CacheBuilder für verschiedene Anwendungsfälle haben, dann werden Sie wahrscheinlich Ihre eigene Factory-Klasse und Methode erstellen möchten.