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