2012-04-27 36 views

回答

10

雖然有可能call arbitrary methods in Spring XML using the factory-method attribute,你會發現它幾乎是不可能的生成器,圖案風格鏈式調用。

相反,使用這種複雜的場景一個FactoryBeanJava-based container configuration。恐怕,XML不會讓你走得太遠。

+0

謝謝 - 我通過FactoryBean運行它! – kuriouscoder 2012-04-27 22:13:41

+0

@ kuriouscoder你能分享你的片段,我在同一條船上,謝謝! – 2012-08-20 22:28:06

+0

如果你更喜歡使用Java配置,這個問題上有一個完整的例子:http://stackoverflow.com/questions/8181768/can-i-set-a-ttl-for-cacheable/31926759#31926759 – anataliocs 2015-08-10 18:47:04

18

隨着在未來番石榴版本加入CacheBuilderSpec(12版),你就可以創建一個XML格式的CacheBuilder豆,使用CacheBuilder.from(String spec)靜態工廠方法。

它應該是這樣的:

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

你甚至可以外部化配置字符串轉換成屬性文件,使用Spring的PropertyPlaceholderConfigurer

在此之前,你應該使用肖恩·帕特里克·弗洛伊德的解決方案(這也有類型安全的優勢)。

2

也想補充一點,你可以直接使用緩存規格的緩存管理器,如果你不感興趣的不同緩存建設者不同的緩存。

當初始化緩存管理器時,不需要按名稱指定每個緩存,緩存的每個新請求都將基於提供的緩存構建器創建一個緩存,或者在此情況下使用提供的緩存規範(這會導致相應的CacheBuilder)。

你的Spring XML最終是極爲考究:

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

另請注意:不要忘記包括在您的應用程序配置XML這樣的事情要告訴你正在使用的緩存春:

<cache:annotation-driven/> 

,你將需要當然的定義:

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" 

如果你不這樣做像這樣簡單的事情,並且你希望有多個CacheBuilder用於不同的用例,那麼你可能會想要創建自己的Factory Class和Method。