4 回答
TA贡献1793条经验 获得超6个赞
正如所指出的,设置 ehcache 需要一些时间,并且不能完全与@PostConstruct. 在这种情况下,使用ApplicationStartedEvent加载缓存。
GitHub 仓库:spring-ehcache-demo
@Service
class CodeCategoryService{
@EventListener(classes = ApplicationStartedEvent.class )
public void listenToStart(ApplicationStartedEvent event) {
this.repo.findByCodeValue("100");
}
}
interface CodeCategoryRepository extends JpaRepository<CodeCategory, Long>{
@Cacheable(value = "codeValues")
List<CodeCategory> findByCodeValue(String code);
}
注意:其他人指出的方法有多种。您可以根据自己的需要进行选择。
TA贡献1797条经验 获得超4个赞
我的方法是定义一个通用的缓存处理程序
@FunctionalInterface
public interface GenericCacheHandler {
List<CodeCategory> findAll();
}
及其实现如下
@Component
@EnableScheduling // Important
public class GenericCacheHandlerImpl implements GenericCacheHandler {
@Autowired
private CodeRepository codeRepo;
private List<CodeCategory> codes = new ArrayList<>();
@PostConstruct
private void intializeBudgetState() {
List<CodeCategory> codeList = codeRepo.findAll();
// Any customization goes here
codes = codeList;
}
@Override
public List<CodeCategory> getCodes() {
return codes;
}
}
在服务层调用如下
@Service
public class CodeServiceImpl implements CodeService {
@Autowired
private GenericCacheHandler genericCacheHandler;
@Override
public CodeDTO anyMethod() {
return genericCacheHandler.getCodes();
}
}
TA贡献1875条经验 获得超3个赞
使用CommandLineRunner接口。基本上,您可以创建一个 Spring @Component 并实现 CommandLineRunner 接口。您将不得不重写它的运行方法。run 方法将在应用程序启动时调用。
@Component
public class DatabaseLoader implements
CommandLineRunner {
@override
Public void run(.... string){
// Any code here gets called at the start of the app.
}}
这种方法主要用于使用一些初始数据引导应用程序。
TA贡献1744条经验 获得超4个赞
使用二级休眠缓存来缓存所有需要的数据库查询。
为了在应用程序启动时缓存,我们可以在任何服务类中使用@PostContruct。
语法将是:-
@Service
public class anyService{
@PostConstruct
public void init(){
//call any method
}
}
添加回答
举报