我有一些麻烦,了解Guice的单例实例化是如何工作的.我已经阅读了可用的文档(此处为http://code.google.com/p/google-guice/wiki/Scopes),但我仍然无法弄清楚一些事情:
1)我已经将Guice与Tomcat集成在一起,我在ServletModule中设置了一些绑定:
bind(MyServlet.class).asEagerSingleton();
serve("myUrl").with(MyServlet.class);
serve("myOtherUrl").with(MyOtherServlet.class);
Run Code Online (Sandbox Code Playgroud)
(其中MyOtherServlet类上面有一个@Singleton注释)我的意图是有两个servlet,其中一个是急切实例化的,而另一个则不是.然而,似乎"serve ... with ..."行自动实例化servlet对象,即使该类未被绑定为急切的单例.我上面提到的链接提到了在Stage.Development和Stage.Production下运行的Guice之间的区别 - 但是即使我明确地使用了Stage.Development(无论如何都是默认的),这仍然会发生.有什么方法可以避免这种情况吗?
2)(继续1)尝试确保MyServlet首先被实例化,即使所有servlet现在急切地实例化,我在创建Injector时修改了模块(和绑定语句)的顺序,以便首先显示MyServlet的绑定.但是,我发现它仍然比其他一些绑定(非servlet类)实例化,其形式如下:
bind(MyInterface.class).to(MyClass.class).asEagerSingleton()
Run Code Online (Sandbox Code Playgroud)
即使这些其他绑定稍后出现在modules/bindings顺序中.我调查了一下,发现Guice只是实例化了那些受"bind ... to ... asEagerSingleton()"形式约束的热切单体,然后再进行"bind ... asEagerSingleton()",所以我通过修改行来解决它:bind(MyServlet.class).asEagerSingleton(); into:bind(MyServletDummyInterface.class).to(MyServlet.class).asEagerSingleton()
这实际上有效.不过,我宁愿避免使用虚拟接口来解决这个问题,所以我想知道是否有人有更好的解决方案..?
3)我有两个Guice模块 - 一个ServletModule和一个AbstractModule.ServletModule configureServlets()中包含以下绑定:
serve("aUrl").with(SomeServlet.class);
Run Code Online (Sandbox Code Playgroud)
AbstractModule的configure()具有以下绑定:
bind(SomeImpl.class).asEagerSingleton();
bind(SomeInterface.class).to(SomeImpl.class).in(Singleton.class);
Run Code Online (Sandbox Code Playgroud)
此外,SomeServlet类具有SomeInterface类型的注入字段,并且在类的顶部具有@Singleton注释.
现在,可以预期在创建注入器时,SomeImpl类将被实例化,并且相同的实例将被注入SomeServlet实例.如前所述,带有"serve ... with ..."语句的servlet似乎也得到了热切的实例化,但无论哪种方式,都应该只有一个SomeImpl对象被实例化.但由于某种原因,我在执行此操作时实例化了两个SomeImpl对象.为了解决这个问题,我在configure()中混合了两行,而不是上面的代码,我有以下几行:
bind(SomeImpl.class).in(Singleton.class)
bind(SomeInterface.class).to(SomeImpl.class).asEagerSingleton();
Run Code Online (Sandbox Code Playgroud)
然后它工作正常,我只有一个实例化SomeImpl的实例.我真的不明白为什么开关应该重要 - 我可以看到后一种方式是如何"更好",但我希望两者都能正常工作,所以我只是想知道我是否在这里弄错了.. ?
抱歉长度,
谢谢你的帮助!
我今天读到了C#4.0代码合同.似乎验证方法的参数不是null的常见做法如下:
Contract.Requires(p != null);
Run Code Online (Sandbox Code Playgroud)
然而,对于我来说,我必须为我的代码中的每个接口方法的每个参数执行此操作,这似乎是不合理的.在绝大多数情况下,参数预计不为空.我希望有某种机制允许定义一些特定的参数被"允许"为空(类似于Java中的"@Nullable"注释),并且Contracts框架将自动确保其余的不是空值.
除了节省很多时间在这个"样板检查"(以及许多"合同类",除了非空参数之外,根本没有任何条件需要验证),它还会使合同代码更清洁而且更"以逻辑为导向".
我的问题是,有没有办法做到这一点,如果没有,哪里没有,或者可能为什么我的方法在这里错了?
我想为我的Python包创建一个bdist.该软件包包含一个LICENSE文件,该文件作为分发的一部分是必需的.
我LICENSE在我的文件中添加了对该文件的引用MANIFEST.IN,实际上在为我的包创建了一个sdist后,该LICENSE文件就在那里.
然而,似乎当我为我的package(python setup.py bdist_wheel)构建一个Python轮时,该LICENSE文件无处可见.
我熟悉setup.py的概念package_data和data_files- 但它们似乎与我的用例无关:
package_data要求LICENSE文件在Python包中,但我需要将此文件放在顶级文件夹中该项目不是Python包.
data_files要求我在安装后映射文件的目标目录,但它不是相对于项目的包,而是相对于python安装 - 我发现它非常奇怪,因为它可能取决于操作系统/平台,是否virtualenv使用等
据我所知,在一天结束时,软件包安装在site-packages安装后的"顶级文件"下面没有空间.尽管如此,我正在寻找一种方法将LICENSE文件作为我的一部分wheel,即使它在安装过程中没有被复制到任何特定位置.
我似乎无法弄清楚为什么我试图制作的方法调用不起作用.
在问这个问题之前我已经看了很多,虽然有很多关于类似问题的线程,但我找不到一个非常适合我的问题.
我有以下代码:
(在文件Processor.java :)
public interface Processor
{
Runner<? extends Processor> getRunner();
}
Run Code Online (Sandbox Code Playgroud)
(在文件Runner.java :)
public interface Runner<P extends Processor>
{
int runProcessors(Collection<P> processors);
}
Run Code Online (Sandbox Code Playgroud)
(在某些其他文件中,在某些方法中:)
Collection<? extends Processor> processorsCollection = ...;
Runner<? extends Processor> runner = ...;
runner.runProcessors(processorsCollection);
Run Code Online (Sandbox Code Playgroud)
IntelliJ将最后一行标记为错误:
"Runner中的RunProcessors(java.util.Collection>)无法应用于(java.util.Collection>)".
我无法弄清楚我做了什么是错的,特别是因为错误信息不太清楚..有
什么建议吗?
谢谢.
Javascript setInterval方法是否等待(至少)特定代码的两次执行之间的指定时间间隔,还是在完成上一次执行和下一次执行开始之间等待该时间间隔?
(或者,比较Java的时候ScheduledExecutorService方法-是的setInterval相似scheduleAtFixedRate()或者说scheduleWithFixedDelay()?)
当我使用 Spark 从 S3 读取多个文件时(例如一个包含许多 Parquet 文件的目录) -
逻辑分区是否在开始时发生,然后每个 executor 直接下载数据(在工作节点上)?
还是驱动程序下载数据(部分或全部)然后才进行分区并将数据发送给执行程序?
此外,分区是否会默认为用于写入的相同分区(即每个文件 = 1 个分区)?
我有兴趣提交一个名为“.git”的目录,该目录位于我的存储库内的某个位置,但到目前为止我还没有找到一种使用 git 执行此操作的方法。
澄清一下,这实际上不是我的存储库的“.git”文件夹,而是我的一个单元测试的资源目录,它恰好被命名为“.git”。在它里面有一个名为“gitfile”的文件。
我试过在目录名上使用“git add -f”,但得到了这些错误:
error: Invalid path '.../.git/gitfile'
error: unable to add .../.git/gitfile to index
fatal: adding files failed
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题来提交这个目录?
在 Parquet 文件格式中使用嵌套数据类型是否有任何性能优势?
AFAIK Parquet 文件通常是专门为查询服务创建的,例如 Athena,因此创建这些文件的过程也可以简单地展平值 - 从而允许更容易的查询、更简单的架构,并保留每列的列统计信息。
使用嵌套数据类型有什么好处,例如struct?
我知道 Parquet 文件存储列统计信息column每个行组内的级别上存储列统计信息,以允许对数据进行更有效的查询。
它是否还存储该file级别的列统计信息(以避免不必要地读取整个文件)?栏目page级别怎么样?
既然Spark 2.4内置了对Avro格式的支持,我正在考虑更改我的数据湖中某些数据集的格式-通常将这些数据集查询/合并为整个行,而不是特定的列聚合-从Parquet更改为阿夫罗
但是,数据之上的大部分工作都是通过Spark完成的,据我所知,Spark的内存中缓存和计算是在列格式的数据上完成的。Parquet是否在这方面提供性能提升,而Avro会带来某种形式的数据“转换”损失?在这方面,我还应注意其他哪些注意事项?
apache-spark ×4
parquet ×3
data-files ×2
java ×2
amazon-s3 ×1
avro ×1
c# ×1
c#-4.0 ×1
eager ×1
generics ×1
git ×1
guice ×1
javascript ×1
nested ×1
packaging ×1
python ×1
python-wheel ×1
setinterval ×1
singleton ×1