如何在spring中使用外部属性禁用ehcache

时间:2011-09-03 13:27:58

标签: java spring ehcache

我需要您的快速帮助来解决一个小问题。

在我的一个项目中(使用spring作为核心容器),我使用ehcache来缓存数据。我正在使用spring ehcache annotations项目(http://code.google.com/p/ehcache-spring-annotations/)。

我希望能够灵活地根据外部属性启用和禁用ehcache。我阅读了ehcache文档,发现它在内部读取系统属性net.sf.ehcache.disabled,如果设置为true,则会禁用缓存,他们建议在命令行中将其作为-Dnet.sf.ehcache.disabled=true传递

我想通过外部化的spring属性文件来控制它。

然后我考虑使用基于外部化属性的MethodInvokingFactoryBean在我的spring应用程序上下文文件中设置此系统属性。

这是代码

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject">
        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="targetClass" value="java.lang.System"/>
            <property name="targetMethod" value="getProperties"/>
        </bean>
    </property>
    <property name="targetMethod" value="putAll"/>
    <property name="arguments">
        <util:properties>
            <prop key="net.sf.ehcache.disabled">"${ehcache.disabled}"</prop>
        </util:properties>
    </property>
</bean>

显然ehcache.disabled是通过我的外部化属性文件控制的。

水暖工作很好,但我猜订单没有到位。当Application上下文设置系统属性时,初始化缓存,并且在初始化缓存时没有属性net.sf.ehcache.disabled,因此缓存不会被禁用。当我在调试模式下运行应用程序并在初始化应用程序上下文后尝试获取System.getProperty("net.sf.ehcache.disabled")时,它给了我正确的值。 (我试过了真假)。

我想提到的另一件事是我使用spring wrapper来初始化我的缓存。

<ehcache:annotation-driven self-populating-cache-scope="method"/>

<ehcache:config cache-manager="cacheManager">
    <ehcache:evict-expired-elements interval="20"/>
</ehcache:config>

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
      p:configLocation="classpath:ehcache.xml"/>

我相信禁用缓存不会那么难。

我错过了什么?除了命令行之外,还有什么简单的方法可以在春天完成吗?

3 个答案:

答案 0 :(得分:2)

从Spring 3.1开始,可以使用可以从外部属性读取属性的bean配置文件。您可以将声明的bean包装在beans元素中:

<beans profile="cache-enabled"> 
  <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:configLocation="classpath:ehcache.xml"/> 
</beans>

然后使用this博文中提到的外部属性激活它。

答案 1 :(得分:2)

最简单的方法(Spring 3.1之前的版本)是将一个bean id添加到MethodInvokingFactoryBean声明中,然后添加一个依赖关系。

答案 2 :(得分:0)

如果您的外部属性不为真,您可以返回 NoOpCacheManager 对象

    @Value("${cache.enabled}")
    private Boolean cacheEnabled;
    @Bean(destroyMethod="shutdown")
    public net.sf.ehcache.CacheManager ehCacheManager() {

        net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();

        CacheConfiguration cacheConfiguration = new CacheConfiguration();
        cacheConfiguration.setName("mycache");
        cacheConfiguration.setMemoryStoreEvictionPolicy("LRU");
        cacheConfiguration.setMaxEntriesLocalHeap(1000);
        cacheConfiguration.setTimeToIdleSeconds(0);
        cacheConfiguration.setTimeToLiveSeconds(3600);
        cacheConfiguration.persistence(new PersistenceConfiguration().strategy(PersistenceConfiguration.Strategy.NONE));

        config.addCache(cacheConfiguration);
 cacheMaxEntriesLocalHeap, cacheEvictionPolicy);
        return net.sf.ehcache.CacheManager.newInstance(config);

    }
    @Bean
    @Override
    public CacheManager cacheManager() {
        if(cacheEnabled) {
            log.info("Cache is enabled");
            return new EhCacheCacheManager(ehCacheManager());
        }else{
            log.info("Cache is disabled");
            return new NoOpCacheManager();
        }
    }