当前位置: 首页 > 知识库问答 >
问题:

没有xml怎么配置Ehcache 3 spring boot java config?

左华灿
2023-03-14

我使用<code>Ehcache 2作为Spring引导。这是我的配置:

@Bean
public CacheManager cacheManager() {
    return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}

@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
    EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
    cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
    cmfb.setShared(true);
    return cmfb;
}

ehcache.xml - in resources.

现在我想使用<code>Ehcache 3 spring boot

1)为什么几乎所有的例子都是基于xml?这怎么可能比java config好?

2) 如何在不使用 xml 的情况下在 spring boot 中使用 java 配置 Ehcache 3?

共有3个答案

詹联
2023-03-14

我更喜欢使用JAVA配置而不是XML配置。下面有两个代码示例,它们执行相同的逻辑但以不同的风格编写。

XML方法:

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.cache.support.CompositeCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.ClassPathResource;

import java.util.Collections;

@EnableCaching
@Configuration
public class CacheConfig {

    @Primary
    @Bean("cacheManager")
    public CompositeCacheManager cacheManager() {
        CompositeCacheManager compositeCacheManager = new CompositeCacheManager();
        compositeCacheManager.setFallbackToNoOpCache(true);
        compositeCacheManager.setCacheManagers(Collections.singleton(ehCacheManager()));
        return compositeCacheManager;
    }

    @Bean("ehCacheManager")
    public EhCacheCacheManager ehCacheManager() {
        EhCacheCacheManager ehCacheCacheManager = new EhCacheCacheManager();
        ehCacheCacheManager.setCacheManager(ehCacheManagerFactoryBean().getObject());
        return ehCacheCacheManager;
    }

    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
        ehCacheManagerFactoryBean.setShared(true);
        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
        return ehCacheManagerFactoryBean;
    }

}

ehcache.xml

<ehcache name="custom_eh_cache">
    <diskStore path="java.io.tmpdir"/>
    <cache name="users"
           maxElementsInMemory="1000"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="3600"
           memoryStoreEvictionPolicy="LRU"/>
    <cache name="roles"
           maxElementsInMemory="1000"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="3600"
           memoryStoreEvictionPolicy="LRU"/>    
</ehcache>

JAVA方法:

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.config.CacheConfiguration;
import net.sf.ehcache.config.DiskStoreConfiguration;
import net.sf.ehcache.store.MemoryStoreEvictionPolicy;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.support.CompositeCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import java.util.Collections;

@EnableCaching
@Configuration
public class CacheConfig {

    @Primary
    @Bean("cacheManager")
    public CompositeCacheManager cacheManager() {
        CompositeCacheManager compositeCacheManager = new CompositeCacheManager();
        compositeCacheManager.setFallbackToNoOpCache(true);
        compositeCacheManager.setCacheManagers(Collections.singleton(ehCacheManager()));
        return compositeCacheManager;
    }

    @Bean("ehCacheManager")
    public EhCacheCacheManager ehCacheManager() {
        EhCacheCacheManager ehCacheCacheManager = new EhCacheCacheManager();
        ehCacheCacheManager.setCacheManager(getCustomCacheManager());
        return ehCacheCacheManager;
    }

    private CacheManager getCustomCacheManager() {
        CacheManager cacheManager = CacheManager.create(getEhCacheConfiguration());
        cacheManager.setName("custom_eh_cache");
        cacheManager.addCache(createCache("users"));
        cacheManager.addCache(createCache("roles"));
        return cacheManager;
    }

    private Cache createCache(String cacheName) {
        CacheConfiguration cacheConfig = new CacheConfiguration(cacheName, 1000)
                .memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LRU)
                .eternal(false)
                .timeToLiveSeconds(3600)
                .timeToIdleSeconds(3600);
        return new Cache(cacheConfig);
    }

    private net.sf.ehcache.config.Configuration getEhCacheConfiguration() {
        net.sf.ehcache.config.Configuration configuration = new net.sf.ehcache.config.Configuration();
        DiskStoreConfiguration diskStoreConfiguration = new DiskStoreConfiguration();
        diskStoreConfiguration.setPath("java.io.tmpdir");
        configuration.addDiskStore(diskStoreConfiguration);
        return configuration;
    }

}
秦楚
2023-03-14

有很多例子。我个人是Java配置的粉丝。

以下是主要的官方例子:

  • 基本编程配置
  • 完全成熟的Spring-Boot配置(包括集群)
  • 使用Spring PetCareic进行更简单的配置
龚钧
2023-03-14

下面是用于创建 Ehcache 管理器 bean 的等效 java 配置。

ApplicationConfig.java

@Configuration
@EnableCaching
public class ApplicationConfig {

    @Bean
    public CacheManager ehCacheManager() {
        CachingProvider provider = Caching.getCachingProvider();
        CacheManager cacheManager = provider.getCacheManager();

        CacheConfigurationBuilder<String, String> configuration =
                CacheConfigurationBuilder.newCacheConfigurationBuilder(
                        String.class,
                        String.class,
                     ResourcePoolsBuilder
                             .newResourcePoolsBuilder().offheap(1, MemoryUnit.MB))
                .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(20)));

        javax.cache.configuration.Configuration<String, String> stringDoubleConfiguration = 
Eh107Configuration.fromEhcacheCacheConfiguration(configuration);

            cacheManager.createCache("users", stringDoubleConfiguration);
            return cacheManager;

    }

}

ServiceImpl.java

@Service
public class ServiceImpl {

    @Cacheable(cacheNames = {"users"})
    public String getThis(String id) {
        System.out.println("Method called............");
        return "Value "+ id;
    }
}

pom.xml

     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.cache</groupId>
        <artifactId>cache-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.ehcache</groupId>
        <artifactId>ehcache</artifactId>
    </dependency>
 类似资料:
  • 也许,我搜索了所有的互联网,但我一定错过了什么。 我根据文档配置Log4j2和Commons日志。我添加了,但其配置对应用程序输出没有影响。我看Log4j没有读这个文件。这是我的配置: pom.xml \src\main\资源\log4j2.xml 在任何类中-例如A类 应用程序具有函数,因此可以由IDE或mvn exec:java运行。 问题: 日志记录正在工作-但使用默认方式。 正如您在文件中

  • 问题内容: 我是Spring的新手。让我感到困惑的是,有时我看到带有版本化模式的XML配置文件,而有时却看到非版本化模式的XML配置文件。例如,有时我看到类似 有时像这样: 请注意,两个示例中的和模式是不同的。 所以,我的问题是,你将使用哪种样式以及为什么使用?特别是,将来版本更新的架构会不可用,并且当Spring更新架构时,非版本化的架构会与当前应用程序保持兼容吗? 另一个问题是,在哪里可以找到

  • 我已经将log4j从1.2.17升级到了2.16.0。因此我不得不重写我的log4j。并将其重命名为log4j2.xml。我已经做了必要的改变。然而,我的新配置似乎没有加载。我试图通过两个web配置log4j。xml: 和。两种方法都失败了,我在mylog.log文件中没有任何日志。但是当在本地运行应用程序时,控制台会显示日志。 这是我的log4j2.xml: 我尝试使用以下工具调试log4j配置

  • 当我运行这个应用程序时,它抱怨说: org.xml.sax.saxParseException:schemaLocation:schemaLocation值=

  • 问题内容: 我有一个使用Spring3和Hibernate4的Web项目,现在我想在不使用xml文件的情况下测试DAO。为此,我创建了一个类,该类使用应用程序的xml文件中包含的数据和一个简单的测试类创建一个LocalSessionFactoryBean。 但是, localSessionFactoryBean.getObject() 返回的 sessionFactory 为null。我一直在寻找

  • 本文向大家介绍没有promise怎么办?相关面试题,主要包含被问及没有promise怎么办?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 没有promise,可以用回调函数代替