我在理解 Guice 的单例实例化的工作原理时遇到了一些麻烦。我已经阅读了可用的文档(此处 - http://code.google.com/p/google-guice/wiki/Scopes),但我仍然无法弄清楚一些事情:
我已将 Guice 与 Tomcat 集成,并在 ServletModule 中设置了一些绑定(bind):
bind(MyServlet.class).asEagerSingleton();
serve("myUrl").with(MyServlet.class);
serve("myOtherUrl").with(MyOtherServlet.class);
(其中 MyOtherServlet 类在其上方有一个 @Singleton 注释) 我在这里的意图是有两个 servlet,其中一个被急切地实例化,而另一个则没有。然而,“serve...with...”行似乎自动实例化了 servlet 对象,即使该类未绑定(bind)为热切的单例。 我在上面附加的链接提到了在 Stage.Development 和 Stage.Production 下运行的 Guice 之间的区别——但是即使我明确使用 Stage.Development(无论如何这是默认的),这仍然会发生。 有什么办法可以避免这种情况吗?
(继续 1)尝试确保 MyServlet 首先被实例化,即使现在所有 servlet 都急切地实例化,我在创建注入(inject)器时修改了模块(和绑定(bind)语句)的顺序,以便 MyServlet 的绑定(bind)首先出现。但是,我发现它的实例化时间仍然晚于其他一些绑定(bind)(非 servlet 类),其形式如下:
bind(MyInterface.class).to(MyClass.class).asEagerSingleton()
即使那些其他绑定(bind)出现在模块/绑定(bind)顺序的后面。 我调查了一下,发现 Guice 只是在执行“绑定(bind)...asEagerSingleton()”之前实例化了以“绑定(bind)...到...asEagerSingleton()”形式绑定(bind)的急切单例,所以我通过修改行解决了它:
bind(MyServlet.class).asEagerSingleton();
进入:
bind(MyServletDummyInterface.class).to(MyServlet.class).asEagerSingleton()
这确实奏效了。不过,我宁愿避免使用虚拟界面来解决这个问题,所以我想知道是否有人对此有更好的解决方案......?
我有两个 Guice 模块 - 一个 ServletModule 和一个 AbstractModule。 ServletModule configureServlets() 中有以下绑定(bind):
serve("aUrl").with(SomeServlet.class); AbstractModule 的 configure() 具有以下绑定(bind):
bind(SomeImpl.class).asEagerSingleton();
bind(SomeInterface.class).to(SomeImpl.class).in(Singleton.class);
此外,SomeServlet 类有一个 SomeInterface 类型的注入(inject)字段,并且在类的顶部有一个@Singleton 注释。
现在,人们会期望在创建注入(inject)器时,SomeImpl 类将被实例化,并且相同的实例将被注入(inject)到 SomeServlet 实例中。如前所述,以“serve...with...”语句为界的 servlet 似乎也被急切地实例化,但无论哪种方式,应该仍然只有一个 SomeImpl 对象被实例化。然而出于某种原因,我在执行此操作时实例化了两个 SomeImpl 对象。 为了解决这个问题,我将 configure() 中的两行混合了一点,而不是上面我有以下几行:
bind(SomeImpl.class).in(Singleton.class)
bind(SomeInterface.class).to(SomeImpl.class).asEagerSingleton();
然后它工作正常,我只实例化了一个 SomeImpl 实例。我真的不明白为什么 switch 应该很重要——我可以看到后一种方式是如何“更好”,但我希望两者都能正常工作,所以我只是想知道我是否在这里弄错了.. .
最佳答案
1) 没有办法避免这种情况,因为 Guice 在它自己的过滤器管道初始化时调用所有 servlet 的 init() 方法,从而构造它们。如果你真的需要这样的惰性初始化逻辑,你应该把它放在 servlet 本身中(或者使用一个解耦的帮助类,或者......有很多方法,取决于你的用例)。
2) 一般来说,Guice 的模块declare bindings,并没有设计成具有精确实例化顺序的引导定义。如果您需要这样定义的实例化顺序,请按照所需的顺序自行创建对象并通过 bind(...).toInstance(...) 绑定(bind)它们。如果您需要在自构造实例中注入(inject),您可以使用requestInjection(...)(如果字段/方法注入(inject)足够,构造函数注入(inject)会更麻烦)。
3) Guice 的范围适用于绑定(bind)键,而不是绑定(bind)值,Applying Scopes描述为什么只有您的第二个示例按预期工作。
关于java - Guice eager/lazy 单例实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8053515/
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/