ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Spring Boot ehcache 2 示例 > 原文: [https://howtodoinjava.com/spring-boot/ehcache2-config-example/](https://howtodoinjava.com/spring-boot/ehcache2-config-example/) 了解如何使用 **ehcache 2.x** 在 [spring boot](https://howtodoinjava.com/spring-boot-tutorials/) 应用程序中配置缓存。 学习使用基于**注解的缓存配置**以及使用[`CacheManager`](https://docs.spring.io/autorepo/docs/spring-framework/4.1.8.RELEASE/javadoc-api/org/springframework/cache/CacheManager.html)手动更新缓存。 ## 1\. Maven 依赖 在此示例中,我们使用的是 Spring 运行版本`1.5.13.RELEASE`。 较早的 spring boot 版本支持`net.sf.ehcache`软件包下的`ehcache 2.x`。 我们需要以下依赖项来添加缓存功能。 * `spring-boot-starter-cache` * **ehcache**(`net.sf.ehcache`) * **缓存 API**(`javax.cache`) `pom.xml` ```java <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.company</groupId> <artifactId>SpringBootEhcache</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>SpringBootEhcache</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <skipTests>true</skipTests> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency> <dependency> <groupId>javax.cache</groupId> <artifactId>cache-api</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ``` ## 2\. `ehcache.xml` Spring Boot 会自动检测`classpath`中是否存在`ehcache.xml`并对其进行配置。 在这里,我们提供缓存名称,到期时间等。 在[ ehcache 文档](https://www.ehcache.org/documentation/2.8/configuration/configuration.html#dynamically-changing-cache-configuration)中找到属性的完整列表。 `ehcache.xml` ```java <ehcache> <diskStore path="java.io.tmpdir" /> <defaultCache maxElementsInMemory="2000" eternal="true" overflowToDisk="false" timeToLiveSeconds="1200" /> <cache name="employeeCache" maxElementsInMemory="2000" eternal="false" overflowToDisk="false" timeToLiveSeconds="10000" /> </ehcache> ``` ## 3\. `@EnableCaching` 它启用 Spring 的注解驱动的缓存管理功能,并在调用`@Cacheable`注解方法时启用对拦截器的支持。 `CacheConfig.java` ```java import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Configuration; @Configuration @EnableCaching public class CacheConfig { } ``` ## 4\. `@Cacheable`注解 要缓存从方法调用返回的数据,我们可以在方法上使用[`@Cacheable`](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html)注解。 使用其属性`cacheNames`和`key`来指代缓存和缓存条目的键属性。 `EmployeeManager.java` ```java import java.util.HashMap; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class EmployeeManager { static HashMap<Long, Employee> db = new HashMap<>(); static { db.put(1L, new Employee(1L, "Alex", "Gussin")); db.put(2L, new Employee(2L, "Brian", "Schultz")); } @Cacheable(cacheNames="employeeCache", key="#id") public Employee getEmployeeById(Long id) { System.out.println("Getting employee from DB"); return db.get(id); } } ``` ## 5\. `CacheManager` API 有时,在使用注解似乎不是完美解决方案的情况下,我们可能需要使用缓存。 在这种情况下,我们可以使用`org.springframework.cache.CacheManager`和`org.springframework.cache.Cache`抽象来访问并利用 ehcache 添加和访问缓存条目。 要使用`CacheManager`,我们必须首先自动装配到 spring 组件中,并使用它的`getCache(name)`方法来按名称获取缓存实例。 访问缓存后,我们可以使用其`get()`和`put()`方法来添加和访问缓存条目。 ```java //1 @Autowired private CacheManager cacheManager; //2 Cache cache = cacheManager.getCache("myCache"); cache.put(3L, "Hello"); String value = cache.get(3L).get(); ``` ## 6\. Spring boot ehcache 2 示例 – 演示 我正在创建一个模型类`Employee`,其实例将被缓存。 `Employee.java` ```java import java.io.Serializable; public class Employee implements Serializable { private static final long serialVersionUID = 5517244812959569947L; private Long id; private String firstName; private String lastName; public Employee() { super(); } public Employee(Long id, String firstName, String lastName) { super(); this.id = id; this.firstName = firstName; this.lastName = lastName; } //Getters and setters @Override public String toString() { return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]"; } } ``` 现在在演示应用程序类中,我正在使用`@Cacheable`注解测试基于注解的缓存访问,并使用`CacheManager`进行手动缓存访问。 `Application.java` ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @SpringBootApplication public class Application { @Autowired private CacheManager cacheManager; @Autowired private EmployeeManager employeeManager; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public CommandLineRunner commandLineRunner(ApplicationContext ctx) { return args -> { //This will hit the database System.out.println(employeeManager.getEmployeeById(1L)); //This will hit the cache - verify the message in console output System.out.println(employeeManager.getEmployeeById(1L)); //Access cache instance by name Cache cache = cacheManager.getCache("employeeCache"); //Add entry to cache cache.put(3L, "Hello"); //Get entry from cache System.out.println(cache.get(3L).get()); }; } } ``` 程序输出。 `Console` ```java Getting employee from DB Employee [id=1, firstName=Alex, lastName=Gussin] Employee [id=1, firstName=Alex, lastName=Gussin] //Fetched from cache Hello ``` 请在评论中使用 ehcache 将有关此 **spring boot** 缓存示例的问题交给我。 学习愉快! [下载源码](https://howtodoinjava.com/wp-content/downloads/SpringBootCacheDemo-ehcache2.zip)