有人可以通过CacheBuilder
xml提供一个很好的片段来构建并将Google番石榴Spring
注入依赖bean吗?
为了概括,我需要Spring
中的一些示例来说明使用构建器模式构造对象。
答案 0 :(得分:18)
在下一个Guava版本(版本12)中添加CacheBuilderSpec后,您将能够使用CacheBuilder.from(String spec)静态工厂方法在xml中创建CacheBuilder
bean。
看起来像这样:
<bean id="legendaryCacheBuilder"
class="com.google.common.cache.CacheBuilder"
factory-method="from">
<constructor-arg value="maximumSize=42, expireAfterAccess=10m, expireAfterWrite=1h" />
</bean>
您甚至可以使用Spring的PropertyPlaceholderConfigurer
将配置字符串外部化为.properties文件。
在那之前,你应该使用Sean Patrick Floyd的解决方案(它还具有类型安全的优势)。
答案 1 :(得分:10)
虽然可以call arbitrary methods in Spring XML using the factory-method
attribute,但你会发现对于Builder-Pattern风格的链式调用几乎不可能。
相反,请使用FactoryBean
或Java-based container configuration来处理此类复杂情况。我害怕,XML不会让你那么远。
答案 2 :(得分:3)
还想补充一点,如果您对不同缓存的不同缓存构建器不感兴趣,可以直接在缓存管理器中使用缓存规范。
初始化缓存管理器时,您不需要按名称指定每个缓存,缓存的每个新请求都将基于提供的CacheBuilder构建一个,或者在这种情况下使用提供的缓存规范(导致相应的CacheBuilder)。
你的Spring XML最终变得非常优雅:
<bean id="cacheManager" class="org.springframework.cache.guava.GuavaCacheManager">
<property name="cacheSpecification" value="maximumSize=300000,expireAfterWrite=10h" />
</bean>
另请注意:请不要忘记告诉Spring您正在使用缓存,方法是在应用程序配置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,那么您可能希望创建自己的工厂类和方法。