这是我的问题:
首先要知道我正在编写模拟.这是一个独立的应用程序,是单线程的.我基本上有两类具有不同范围要求的对象.
在整个模拟过程中应该用作单例的类.以Random为例,作为一个例子.
一起创建的类组以及组内的每个实例都应该被视为Singleton.例如,假设RootObject是顶级类,并且具有依赖性,ClassA并且ClassB两者都具有依赖性ClassD.对于任何给定的RootObject,它的两个依赖(ClassA和ClassB)应该依赖于相同的实例ClassD.但是,ClassD不应在不同的实例之间共享实例RootObject.
希望这是有道理的.我可以想到两种方法.一种是将所有注入的对象标记为单例,创建根注入器,并在每次需要创建新RootObject实例时分离子注入器.然后,将其实例RootObject和所有依赖项创建为单例,但下次我创建另一个时,该范围信息将被丢弃RootObject.
第二种方法是实现某种类型的自定义范围.
Guice文档给出了相互矛盾的建议......一方面,它说你应该有一个注入器,理想情况下它被调用一次来创建一些顶级类.另一方面,它表示要远离自定义范围.
我在一个注释的模块中有一个提供者方法@Provides:
@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
...
}
Run Code Online (Sandbox Code Playgroud)
我已经注释了我ChatServicePerformanceMonitor的意思@Singleton.在我的代码中,我使用这个实例,我无法"被动地"注入它,因为我正在使用的框架构建封闭类(它不使用Guice,所以这是我知道的唯一方法得到参考):
chatServicePerfMon = injector.getInstance(ChatServicePerformanceMonitor.class);
Run Code Online (Sandbox Code Playgroud)
Guice似乎不尊重@Singleton我ChatServicePerformanceMonitor班级的注释.每次调用inject.getInstance(ChatServicePerformanceMonitor.class)时都会得到一个实例.
添加@Singleton到提供程序方法似乎解决了这个问题:
@Provides @Singleton
public ChatServicePerformanceMonitor getChatServicePerfMon() {
...
}
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?似乎@Singleton实例应该是我需要的全部内容.
也许我只是盲目,但我不知道如何使用Guice(刚开始)来替换new此方法中的调用:
public boolean myMethod(String anInputValue) {
Processor proc = new ProcessorImpl(anInputValue);
return proc.isEnabled();
}
Run Code Online (Sandbox Code Playgroud)
对于测试,可能会有一个不同的处理器实现,所以我想避免new调用,并在此过程中摆脱对实现的依赖.
如果我的类只记得处理器的一个实例,我可以通过构造函数注入它,但由于处理器被设计为不可变的,我每次都需要一个新的.
我将如何使用Guice(2.0)实现这一目标?
我是Guice的新手,这是一个天真的问题.我了解到我们可以通过以下方式将String绑定到特定值:
bind(String.class)
.annotatedWith(Names.named("JDBC URL"))
.toInstance("jdbc:mysql://localhost/pizza");
Run Code Online (Sandbox Code Playgroud)
但是如果我想将String绑定到任何可能的字符呢?
或者我认为可以这样描述:
如何用Guice替换"new SomeClass(String strParameter)"?
我试图找出一种简单的方法来将DTO映射到没有样板代码的实体.虽然我在考虑使用dozer,但似乎需要大量的xml配置.有没有人看过使用DSL在纯Java中配置bean映射的推土机替代方案?
理想情况下,我希望找到一个受Guice做事方式启发的bean映射器.
我正在使用tomcat 6,jersey 1.8 with jersey guice and guice 3.我在设置时使用JSP时遇到问题.我有一个"Status"servlet作为web.xml配置的简单servlet,一个由GuiceFilter配置的jersey servlet,它返回一个jsp视图响应(jsp是/diff/index.jsp),用于呈现结果,如下所示:
Viewable view = new Viewable("/diff/index.jsp", null);
Response response = Response.ok().entity(view).build();
return response;
Run Code Online (Sandbox Code Playgroud)
这一切都与简单的泽西岛完美配合,一旦我试图用Guice集成它,JSP失败了,我得到了404响应,"请求的资源(/diff/index.jsp)不可用."
使用调试器,我可以看到JSPTemplateProcessor被调用,并获得了一个RequestDispatcher,其StandardWrapper具有"isJspServlet = true"和"jspFile = null".
<servlet>
<display-name>Status Page</display-name>
<servlet-name>Status</servlet-name>
<servlet-class>my.BaseStatusPage</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Status</servlet-name>
<url-pattern>/Status/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/REST/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>my.GuiceServletConfig</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
=====================
GuiceServletConfig:
public class GuiceServletConfig extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new JerseyServletModule() {
@Override
protected void configureServlets() {
bind(DiffPage.class);// the jersey servlet
Map<String, String> params …Run Code Online (Sandbox Code Playgroud) 在Scala中,我可以使用Guice注入Scala object吗?
例如,我可以注入s以下对象吗?
object GuiceSpec {
@Inject
val s: String = null
def get() = s
}
Run Code Online (Sandbox Code Playgroud) 我从头开始创建一个新的Java Web应用程序.
我对Spring Framework没有太多经验,但我知道我想使用它的一些功能,比如Transaccions Management.
另一方面,我非常喜欢Guice的依赖注入.
我知道Guice和Spring可以一起工作:http://www.jroller.com/mindcrime/entry/an_example_of_integrating_guice
但在开始设计我的应用程序之前,我想知道是否有人通过遵循该方法遇到了问题.
另外,我真正喜欢Guice的是你不需要XML配置文件,而只需要java模块,它更短,更容易阅读.Spring上有没有XML配置文件的替代品,类似于Guice?
我正在开展一个由四部分组成的项目:
Main将所有事物融合在一起的项目.这包含public static void main(String... args)入口点.ABCommon组件,这两个A和B参考.我正在使用Guice来处理所有四个部分之间的管道,这就是我的问题:
在As和Bs主要的Guice模块中,我安装了一个扩展了一个模块的模块Common.在运行时,此设置失败,并显示以下错误:
common.SomeClass已配置绑定到common.AbstractCommonModule.configure().[ 来源 ]
原因是我要调用common.AbstractCommonModule.configure()两次; 一旦通过安装的子类实例common.AbstractCommonPrivateModule从组件A的com.a.MainModule.configure(),并从部件的第二时间B的com.b.MainModule.configure().
只安装一个common.AbstractCommonPrivateModule in 实例Main不是一个选项,因为AbstractCommonPrivateModule实现了一个特定的binder方法bindComplicatedStuff(ComplicatedStuff),我只分别知道其中的参数A和B.
我尝试通过将As和B各自的主要Guice模块包装在s中来解决这个问题PrivateModule.但是,由于下一个错误,此操作失败:
无法为%s创建绑定.它已经在一个或多个子注入器或私有模块上配置%s%n如果它在PrivateModule中,您是否忘记公开绑定?[ 来源 ]
在我的情况下,A's和B各自的主要Guice模块实际上是ServletModules …
对于用Java编写的监控软件,我考虑使用Google Guice作为DI提供程序.项目需要从外部资源(文件或数据库)加载其配置.该应用程序旨在以独立模式或servlet容器运行.
目前,配置不包含依赖项注入的绑定或参数,只有一些全局应用程序设置(JDBC连接定义和关联的数据库管理/监视对象).
我看到两个选择:
要么
您是否建议将Guice用于这两项任务,或者将一般应用程序配置与依赖注入分开?您认为哪些优点和缺点最重要?