package io.github.hengyunabc.mybatis;
import java.util.concurrent.locks.ReadWriteLock;
import org.apache.ibatis.cache.Cache;
import org.springframework.context.ApplicationContext;
public class FacadeCache implements Cache {
public static final String DEFAULT_CACHE_FACTORY_BEAN_NAME = "mybatisCacheDefaultFactory";
Cache cache;
String springContextName = null;
String cacheFactoryBeanName = null;
public FacadeCache(final String id) {
String contextName =
springContextName != null ? springContextName
: SharedSpringContext.DEFAULT_SPRINGCONTEXT_NAME;
ApplicationContext applicationContext = SharedSpringContext.get(contextName);
if(applicationContext == null){
throw new RuntimeException("can not found spring applicationContext, need a SharedSpringContextSetter!!");
}
String beanName =
cacheFactoryBeanName != null ? cacheFactoryBeanName : DEFAULT_CACHE_FACTORY_BEAN_NAME;
CacheFactory cacheFactory = applicationContext.getBean(beanName, CacheFactory.class);
if(cacheFactory == null){
throw new RuntimeException("can not found CacheFactory, need a bean name is:" + beanName);
}
this.cache = cacheFactory.getCache(id);
}
@Override
public String getId() {
return cache.getId();
}
@Override
public void putObject(Object key, Object value) {
cache.putObject(key, value);
}
@Override
public Object getObject(Object key) {
return cache.getObject(key);
}
@Override
public Object removeObject(Object key) {
return cache.removeObject(key);
}
@Override
public void clear() {
cache.clear();
}
@Override
public int getSize() {
return cache.getSize();
}
@Override
public ReadWriteLock getReadWriteLock() {
return cache.getReadWriteLock();
}
public String getSpringContextName() {
return springContextName;
}
public void setSpringContextName(String springContextName) {
this.springContextName = springContextName;
}
public String getCacheFactoryBeanName() {
return cacheFactoryBeanName;
}
public void setCacheFactoryBeanName(String cacheFactoryBeanName) {
this.cacheFactoryBeanName = cacheFactoryBeanName;
}
}