Java 为什么@Cacheable在控制器和接口中使用时不起作用
springboot 1.5 主要 @EnableCachingproxyTargetClass=true @SpringBoot应用程序 @MapperScanvalue={com.spring15.mapper,com.spring15.cache.mapper} 公共类LearnManager应用程序{ 公共静态无效字符串[]args{ SpringApplication.runLearnMainApplication.class,args; } } 控制器Java 为什么@Cacheable在控制器和接口中使用时不起作用,java,spring,spring-boot,Java,Spring,Spring Boot,springboot 1.5 主要 @EnableCachingproxyTargetClass=true @SpringBoot应用程序 @MapperScanvalue={com.spring15.mapper,com.spring15.cache.mapper} 公共类LearnManager应用程序{ 公共静态无效字符串[]args{ SpringApplication.runLearnMainApplication.class,args; } } 控制器 @PostMapping(&q
@PostMapping("/emp/get")
//@Cacheable(cacheNames = "employee", key = "#id", condition = "#id>0", unless = "#result == null")
public Employee getEmp(@RequestBody Employee employee){
logger.info("====== get ======");
return cacheService.getEmp(employee.getId());
}
迈巴蒂斯映射器
公共接口EmployeeMapper{
@选择Select*from employee,其中id={id}
员工GetEmployeeById集成器id;
//@CachePutcacheNames=员工
@Updateupdate员工集id={id},lastName={lastName},email={email},dId={dId},gender={gender},其中id={id}
int updateEmployee雇员;
//@CacheReceiveCacheNames=员工
@Deletedelete from employee,其中id={id}
整数id;
//@CacheablecacheNames=员工
@将插入插入插入employeelastName、email、dId、性别值{lastName}、{email}、{dId}、{SEXT}
int insertEmpEmployee员工;
}
服务
@服务
//@CacheConfigcacheNames=employee
公共类缓存服务{
@自动连线
EmployeeMapper EmployeeMapper;
//@CacheablecacheNames=employee,key=id,condition=id>0,除非=result==null
公共雇员getEmpInteger id{
返回employeeMapper.getEmployeeById;
}
}
邮递员发送了邮寄请求,然后得到以下结果:
@服务中使用的可缓存
第二次从缓存中获取员工的数据
@服务
//@CacheConfigcacheNames=employee
公共类缓存服务{
@自动连线
EmployeeMapper EmployeeMapper;
@CacheablecacheNames=employee,key=id,condition=id>0,除非=result==null
公共雇员getEmpInteger id{
返回employeeMapper.getEmployeeById;
}
}
@可缓存控制器
@PostMapping("/emp/get")
//@Cacheable(cacheNames = "employee", key = "#id", condition = "#id>0", unless = "#result == null")
public Employee getEmp(@RequestBody Employee employee){
logger.info("====== get ======");
return cacheService.getEmp(employee.getId());
}
始终从数据库获取员工的数据。
@Cacheable不起作用
@后映射/emp/get
@CacheablecacheNames=employee,key=id,condition=id>0,除非=result==null
公职人员getEmp@RequestBody雇员雇员{
logger.info=get=;
返回cacheService.getEmpemployee.getId;
}
@mapper中使用的Cacheable
始终从数据库获取员工的数据。
@Cacheable不起作用
公共接口EmployeeMapper{
@CacheablecacheNames=employee,key=a0,condition=id>0,除非=result==null
@选择Select*from employee,其中id={id}
员工GetEmployeeById集成器id;
//@CachePutcacheNames=员工
@Updateupdate员工集id={id},lastName={lastName},email={email},dId={dId},gender={gender},其中id={id}
int updateEmployee雇员;
//@CacheReceiveCacheNames=员工
@Deletedelete from employee,其中id={id}
整数id;
//@CacheablecacheNames=员工
@将插入插入插入employeelastName、email、dId、性别值{lastName}、{email}、{dId}、{SEXT}
int insertEmpEmployee员工;
}
为什么??他们的区别是什么?公共雇员getEmp@RequestBody雇员雇员{
logger.info=get=;
返回cacheService.getEmpemployee.getId;
}
对于控制器,方法签名不包含id作为参数,因此@Cacheable将无法工作,因为缺少缓存密钥。它有一个Employee作为参数,而不是int-id。因此缓存键应该是Employee.id以使用正确的缓存键
MyBatis映射器不是由Spring管理的,而是由MyBatis管理的,将Spring注释添加到非Spring管理的bean将不会导致任何应用。它将缓存更新计数,而不是缓存雇员,而是以雇员为键的int返回值,而不是值