/**
* 当一个类实现了ApplicationContextAware接口之后,这个类就可以方便的获得ApplicationContext对象(Spring上下文),
* Spring发现某个Bean实现了ApplicationContextAware接口,Spring容器会在创建该Bean之后,
* 自动调用该Bean的setApplicationContext(参数)方法,调用该方法时,会将容器本身ApplicationContext对象作为参数传递给该方法。
*/
@Component
public class SpringContextUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext(){
return applicationContext;
}
public static Object getBean(Class type){
return applicationContext.getBean(type);
}
}
@Component
public abstract class AbstractCache {
public void initCache(){}
public <T> T getCache(String key){
return null;
}
public void clearCache(){}
public void reloadCache(){
clearCache();
initCache();
}
}
/**
* 在使用SpringBoot构建项目时,我们通常有一些预先数据的加载。那么SpringBoot提供了CommandLineRunner方式来实现,
* CommandLineRunner是一个接口,我们需要时,只需实现该接口就行(如果存在多个加载的数据,我们也可以使用@Order注解来排序)
*/
@Component
public class InitCache implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
//我要知道哪些缓存需要进行一个预热
ApplicationContext applicationContext = SpringContextUtil.getApplicationContext();
Map<String, AbstractCache> beanMap = applicationContext.getBeansOfType(AbstractCache.class);
//调用init方法
if(beanMap.isEmpty()){
return;
}
for(Map.Entry<String,AbstractCache> entry : beanMap.entrySet()){
AbstractCache abstractCache = (AbstractCache) SpringContextUtil.getBean(entry.getValue().getClass());
abstractCache.initCache();
}
System.out.println("缓存成功.........");
}
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
for (Entry<String, String> stringStringEntry : map.entrySet()) {
System.out.println(stringStringEntry);
System.out.println("entry.getValue():"+stringStringEntry.getValue());
System.out.println("entry.getValue().getClass():"+stringStringEntry.getValue().getClass());
}
}
}
@Component
public class CategoryCache extends AbstractCache {
private static final String CATEGORY_CACHE_KEY = "CATEGORY";
@Autowired
private RedisUtil redisUtil;
@Autowired
private RedisTemplate redisTemplate;
@Override
public void initCache() {
//跟数据库做联动了,跟其他的数据来源进行联动
redisUtil.set("category","知识");
}
@Override
public <T> T getCache(String key) {
if(!redisTemplate.hasKey(key).booleanValue()){
reloadCache();
}
return (T) redisTemplate.opsForValue().get(key);
}
@Override
public void clearCache() {
redisTemplate.delete(CATEGORY_CACHE_KEY);
}
}