在启动时设置类列表属性的目的是什么?

时间:2012-09-20 10:37:57

标签: playframework-2.0 playorm

启动时设置班级列表属性的目的是什么?看代码似乎用于检查是否需要重新扫描。是什么原因?

如果这个列表是必需的,它看起来像是因为我们几乎无处不在地执行一个未经检查的list.get(0),为什么不在启动时进行强制检查。也许当我理解列表的用途时,我可以实际放置一些值。

1 个答案:

答案 0 :(得分:1)

您不需要再使用重新扫描。这主要适用于playframework等框架。在playframework中,你永远不会重新启动服务器的原因是它重新编译你的类并将它们放在一个“新”类加载器中,这意味着如果这些新重载的类没有“重新扫描”,你的控制器就会遇到麻烦。此重新扫描方法仅适用于playframework中的开发模式。实际上,重新扫描可能不应该在api中,而应该被转移到impl中。现在它被NoSql使用,它在playframework中用来获取EntityManager,就像NoSql.em();

NoSql.java中的以下代码是使用重新扫描的内容(注意:如果newClass == testClass正在测试的测试是某个实体Car.class == Car.class,如果两个Car.class不相等,我们知道playframework重新加载了它的类,我们需要重新扫描那些新的类....)他们为hibernate做同样的事情,因为他们也必须重新扫描hibernate实体。

@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插件之前,你需要实现PlayCallback接口(应该重命名为WebFrameworkCallback),如果你使用的是playframework

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);