JForum的cache是由net.jforum.cache包下的类来实现的
Cacheable.java | 这个接口为Repository实现提供cache引擎 |
CacheEngine.java | JForum的Cache引擎接口 |
DefaultCacheEngine.java | JForum提供的默认cache引擎实现 |
EhCacheEngine.java | EhCache的cache引擎实现 |
JBossCacheEngine.java | JbossCache的cache引擎实现 |
JBossCacheListener.java | Jboss的TreeCacheListener实现 |
net.jforum.repository包下的类都是Cacheable.java接口的实现类,每个repository类通过静态方法提供具体的业务cache方法。
net.jforum.JForumBaseServlet.java是JForum中servlet的一个基类,在它的init方法中调用了ConfigLoader.startCacheEngine();方法来初始化所有的Repository。在这个方法中,JForum从SystemGlobals.properties文件中取得Cache引擎的类型,实例化它,之后从这个配置文件中继续取出repository的列表,然后依次实例化每个repository并将Cache引擎注入。
public static void startCacheEngine()
{
try {
String cacheImplementation = SystemGlobals.getValue(ConfigKeys.CACHE_IMPLEMENTATION);
logger.info("Using cache engine: " + cacheImplementation);
cache = (CacheEngine)Class.forName(cacheImplementation).newInstance();
cache.init();
String s = SystemGlobals.getValue(ConfigKeys.CACHEABLE_OBJECTS);
if (s == null || s.trim().equals("")) {
logger.warn("Cannot find Cacheable objects to associate the cache engine instance.");
return;
}
String[] cacheableObjects = s.split(",");
for (int i = 0; i < cacheableObjects.length; i++) {
logger.info("Creating an instance of " + cacheableObjects[i]);
Object o = Class.forName(cacheableObjects[i].trim()).newInstance();
if (o instanceof Cacheable) {
((Cacheable)o).setCacheEngine(cache);
}
else {
logger.error(cacheableObjects[i] + " is not an instance of net.jforum.cache.Cacheable");
}
}
}
catch (Exception e) {
throw new CacheEngineStartupException("Error while starting the cache engine", e);
}
}
net.jforum.ConfigLoader
如果要在JForum项目中扩展一个cache功能,只需要实现一个Cacheable.java接口的repository类,并在SystemGlobals.properties中的cacheable.objects参数中配置这个repository就可以了。
cacheable.objects = net.jforum.repository.BBCodeRepository, \
net.jforum.repository.RankingRepository, \
net.jforum.repository.SmiliesRepository, \
net.jforum.repository.ForumRepository, \
net.jforum.repository.TopicRepository, \
net.jforum.SessionFacade, \
net.jforum.repository.PostRepository, \
net.jforum.repository.Tpl, \
net.jforum.repository.RolesRepository, \
net.jforum.repository.SecurityRepository, \
net.jforum.repository.BanlistRepository
SystemGlobals.properties