// (把普通pojo实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>就是当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
@Component
public class InitParameter implements ApplicationRunner {
@Autowired
private InitParameterService parameterService;
/**
* 启动时初始化参数,实现ApplicationRunner接口在项目启动成功前执行该方法
*/
@Override
public void run(ApplicationArguments args){
parameterService.initParam();
}
}
@Slf4j
@Service
public class InitParameterService {
@Autowired
private InitParameterMapper parameterMapper;
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 启动时初始化参数
*/
// 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行
@PostConstruct
public void initParam() {
// 查询出所有数据
List<ConfSysDto> sysDtoList = parameterMapper.initParam();
// 通过stream流转换成map,并定义缓存格式
Map<String, String> collect = sysDtoList.stream()
.collect(Collectors.toMap(c -> c.getModule() + ":" + c.getCode(), ConfSysDto::getVals));
// 设置map集合到redis
redisTemplate.opsForHash().putAll("conf:sys:", collect);
// redisTemplate.opsForValue().multiSet(collect); 另外一种格式
log.info("参数列表初始化成功");
}
}
另外一种方法
/**
* 查询redis缓存中的数据
*/
@PostMapping("/find-status")
public Response<List<String>> findStatus() {
return CommonResponse.success(confSysService.findStatus());
}
/**
* 查询redis缓存中的数据
*/
public List<String> findStatus() {
// 定义局部变量 key
String key = "conf:sys";
// 调用方法查询redis中的数据 转换为list<String>
List<String> objectList = redisTemplate.<String, String>opsForHash().values(key);
log.info("获取出的数据:" + objectList);
if (objectList.size() == 0) {
log.info("缓存中没有数据,要从数据库中查询并放入缓存中哦");
List<ConfSysDto> sysDtoList = confSysMapper.initParam();
// 通过stream流转换成map,并定义缓存格式
Map<String, String> collect = sysDtoList.stream()
.collect(Collectors.toMap(c -> c.getModule() + ":" + c.getCode(), ConfSysDto::getVals));
// 设置map集合到redis
redisTemplate.opsForHash().putAll("conf:sys", collect);
log.info("参数列表初始化成功");
return Lists.newArrayList(collect.values());
}
return objectList;
}