在启动时设置类列表属性的目的是什么?查看代码,它似乎用于检查是否需要重新扫描。是什么原因?
如果这个列表是强制性的,看起来是因为我们几乎在所有地方都在执行未经检查的 list.get(0),为什么不在启动时进行强制性检查。也许当我了解列表的用途时,我将能够实际输入一些值。
在启动时设置类列表属性的目的是什么?查看代码,它似乎用于检查是否需要重新扫描。是什么原因?
如果这个列表是强制性的,看起来是因为我们几乎在所有地方都在执行未经检查的 list.get(0),为什么不在启动时进行强制性检查。也许当我了解列表的用途时,我将能够实际输入一些值。
您永远不需要使用重新扫描。这主要是针对像playframework这样的框架。在 playframework 中,您永远不会重新启动服务器的原因是它会重新编译您的类并将它们放入“新”类加载器中,这意味着如果这些新重新加载的类没有“重新扫描”,您的控制器将会遇到问题。此重新扫描方法仅适用于 playframework 中的开发模式。实际上,rescan 可能不应该在 api 中,而应该被移到 impl 中。现在它由 NoSql 使用,它在 playframework 中用于获取 EntityManager,就像 NoSql.em();
NoSql.java 中的以下代码使用了 rescan(注意:如果 newClass == testClass is testing 是某个实体 Car.class == Car.class 的测试,如果两个 Car.class 不相等,我们知道playframework 重新加载了它的类,我们需要重新扫描那些新的类)......他们为休眠做同样的事情,因为他们也必须重新扫描休眠实体。
@SuppressWarnings("rawtypes")
private static void testForRescan() {
List<Class> classesToScan = playCallback.getClassesToScan();
Class newClass = classesToScan.get(0);
if(newClass == testClass)
return;
//otherwise, we need a rescan of all the new classes
ClassLoader cl = playCallback.getClassLoader();
factory.rescan(classesToScan, cl);
testClass = newClass;
}
在我们开发 playframework 插件之前,如果您使用 playframework,您需要实现 PlayCallback 接口(应该重命名为 WebFrameworkCallback)
private static class OurPlayCallback implements PlayCallback {
@Override
public List<Class> getClassesToScan() {
return Play.classloader.getAnnotatedClasses(NoSqlEntity.class);
}
@Override
public ClassLoader getClassLoader() {
return Play.classloader;
}
@Override
public Object getCurrentRequest() {
return Http.Request.current.get();
}
}
所以基本上,直到我们做了一个playframework插件,在启动时,你可以用上面的实现初始化playOrm,然后调用它来初始化NoSql.java类(只在启动时调用一次!!!!!!)
NoSql.initialize(new OurPlayCallback(), db, builder);