16

有人可以提供一个很好的片段来通过xml构造和注入 Google guavaCacheBuilder到依赖 bean 中吗?Spring

概括地说,我需要一些示例Spring来说明使用构建器模式构建对象。

4

3 回答 3

18

通过在下一个 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 的解决方案(它还具有类型安全的优点)。

于 2012-04-27T23:34:26.280 回答
10

虽然可以使用属性调用 Spring XML 中的任意方法factory-method,但您会发现对于 Builder-Pattern 样式的链式调用几乎是不可能的。

相反,对于此类复杂场景,请FactoryBean使用基于 Java 的容器配置。恐怕XML 不会让你走那么远。

于 2012-04-27T20:39:40.373 回答
3

还想补充一点,如果您对不同缓存的不同缓存构建器不感兴趣,您可以直接在缓存管理器中使用缓存规范。

初始化缓存管理器时,您不需要按名称指定每个缓存,每个新的缓存请求都将基于提供的 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,那么您可能希望创建自己的工厂类和方法。

于 2016-03-23T17:00:22.310 回答