Java 在Spring引导启动时将数据加载到Ehcache 3
我想在Spring启动应用程序启动时在缓存中加载数据。 我知道在Ehcache2中有一种使用BootstrapCacheLoader的集成方式。 但我在Ehcache3中看不到这一点。 我仍然可以在@postConstruct方法中手动完成。 但是我想知道是否有一个集成解决方案(Spring5,EHCache3)Java 在Spring引导启动时将数据加载到Ehcache 3,java,spring-boot,ehcache-3,Java,Spring Boot,Ehcache 3,我想在Spring启动应用程序启动时在缓存中加载数据。 我知道在Ehcache2中有一种使用BootstrapCacheLoader的集成方式。 但我在Ehcache3中看不到这一点。 我仍然可以在@postConstruct方法中手动完成。 但是我想知道是否有一个集成解决方案(Spring5,EHCache3) 谢谢。我在Spring上下文初始化之后完成了这项工作。 对于DB集合中的每个元素,我调用getResourceById(),它具有@Cacheable注释,从而填充整个DB集合的缓存
谢谢。我在Spring上下文初始化之后完成了这项工作。 对于DB集合中的每个元素,我调用getResourceById(),它具有@Cacheable注释,从而填充整个DB集合的缓存 我不建议在@PostConstruct中运行这段代码,因为代理可能还没有创建,像@Cacheable这样的注释可能还没有工作 在触发ContextRefreshedEvent事件(初始化后或刷新后)时运行此代码更适合加载缓存
public class CacheLoader {
private final Logger logger = LoggerFactory.getLogger(CacheLoader.class);
@Autowired
private ResourcePermissionRepository resourcePermissionRepository;
@Autowired
private ResourcePermissionService resourcePermissionService;
@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
logger.info("Loading cache following start/refresh event");
for (PermissionGroup permissionGroup : permissionGroupRepository.findAll()) {
permissionGroupService.getGroupById(permissionGroup.getGroupName());
}
for(ResourcePermission resourcePermission: resourcePermissionRepository.findAll()) {
resourcePermissionService.getResourceById(resourcePermission.getResourceId());
}
logger.info("Finished loading cache");
}
public class ResourcePermissionService {
private final Logger logger = LoggerFactory.getLogger(ResourcePermissionService.class);
@Autowired
private ResourcePermissionRepository resourcePermissionRepository;
@Cacheable(value = "resources", sync = true)
public ResourcePermission getResourceById(String resourceId) {
logger.info("Cache miss for resource " + resourceId);
return resourcePermissionRepository.findById(resourceId).orElse(new NullResourcePermission());
}
@CachePut(value = "resources", key = "#result.resourceId")
public ResourcePermission addResourcePermission(ResourcePermission resourcePermission) {
return resourcePermissionRepository.save(resourcePermission);
}
@CacheEvict(value = "resources")
public void deleteById(String resourceId) {
resourcePermissionRepository.deleteById(resourceId);
}
}