标签: guice

自定义Guice范围,还是更好的方法?

这是我的问题:

首先要知道我正在编写模拟.这是一个独立的应用程序,是单线程的.我基本上有两类具有不同范围要求的对象.

  1. 在整个模拟过程中应该用作单例的类.以Random为例,作为一个例子.

  2. 一起创建的类组以及组内的每个实例都应该被视为Singleton.例如,假设RootObject是顶级类,并且具有依赖性,ClassA并且ClassB两者都具有依赖性ClassD.对于任何给定的RootObject,它的两个依赖(ClassAClassB)应该依赖于相同的实例ClassD.但是,ClassD不应在不同的实例之间共享实例RootObject.

希望这是有道理的.我可以想到两种方法.一种是将所有注入的对象标记为单例,创建根注入器,并在每次需要创建新RootObject实例时分离子注入器.然后,将其实例RootObject和所有依赖项创建为单例,但下次我创建另一个时,该范围信息将被丢弃RootObject.

第二种方法是实现某种类型的自定义范围.

Guice文档给出了相互矛盾的建议......一方面,它说你应该有一个注入器,理想情况下它被调用一次来创建一些顶级类.另一方面,它表示要远离自定义范围.

scope design-patterns guice

22
推荐指数
3
解决办法
5852
查看次数

Guice:在这种情况下,如何在模块中配置@Provides和@Singleton?

我在一个注释的模块中有一个提供者方法@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似乎不尊重@SingletonChatServicePerformanceMonitor班级的注释.每次调用inject.getInstance(ChatServicePerformanceMonitor.class)时都会得到一个实例.

添加@Singleton到提供程序方法似乎解决了这个问题:

@Provides @Singleton
public ChatServicePerformanceMonitor getChatServicePerfMon() {
  ...
}
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?似乎@Singleton实例应该是我需要的全部内容.

guice

22
推荐指数
2
解决办法
3万
查看次数

如何使用Google Guice创建需要参数的对象?

也许我只是盲目,但我不知道如何使用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)实现这一目标?

java dependency-injection guice

21
推荐指数
2
解决办法
2万
查看次数

如何将String绑定到Guice中的变量?

我是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)"?

binding guice

21
推荐指数
2
解决办法
3万
查看次数

推土机替代bean映射?

我试图找出一种简单的方法来将DTO映射到没有样板代码的实体.虽然我在考虑使用dozer,但似乎需要大量的xml配置.有没有人看过使用DSL在纯Java中配置bean映射的推土机替代方案?

理想情况下,我希望找到一个受Guice做事方式启发的bean映射器.

dto-mapping guice dto dozer

21
推荐指数
2
解决办法
3万
查看次数

Jersey Guice JSP怎么样?

我正在使用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".

web.xml看起来像这样:

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

java jsp jersey guice

21
推荐指数
1
解决办法
3932
查看次数

Guice可以注入Scala对象

在Scala中,我可以使用Guice注入Scala object吗?

例如,我可以注入s以下对象吗?

object GuiceSpec {
  @Inject
  val s: String = null

  def get() = s
}
Run Code Online (Sandbox Code Playgroud)

scala guice

21
推荐指数
1
解决办法
1万
查看次数

Spring和Guice在一起,或者只是Spring

我从头开始创建一个新的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?

java spring guice application-design web-application-design

21
推荐指数
3
解决办法
1万
查看次数

如何使用两个安装公共依赖模块的Guice模块

我正在开展一个由四部分组成的项目:

  • Main将所有事物融合在一起的项目.这包含public static void main(String... args)入口点.
  • 零件 A
  • 零件 B
  • 第三方Common组件,这两个AB参考.

我正在使用Guice来处理所有四个部分之间的管道,这就是我的问题:
As和Bs主要的Guice模块中,我安装了一个扩展了一个模块的模块Common.在运行时,此设置失败,并显示以下错误:

common.SomeClass已配置绑定到common.AbstractCommonModule.configure().[ 来源 ]

原因是我要调用common.AbstractCommonModule.configure()两次; 一旦通过安装的子类实例common.AbstractCommonPrivateModule从组件Acom.a.MainModule.configure(),并从部件的第二时间Bcom.b.MainModule.configure().

只安装一个common.AbstractCommonPrivateModule in 实例Main不是一个选项,因为AbstractCommonPrivateModule实现了一个特定的binder方法bindComplicatedStuff(ComplicatedStuff),我只分别知道其中的参数AB.

我尝试通过将As和B各自的主要Guice模块包装在s中来解决这个问题PrivateModule.但是,由于下一个错误,此操作失败:

无法为%s创建绑定.它已经在一个或多个子注入器或私有模块上配置%s%n如果它在PrivateModule中,您是否忘记公开绑定?[ 来源 ]

在我的情况下,A's和B各自的主要Guice模块实际上是ServletModules …

java guice

21
推荐指数
1
解决办法
4831
查看次数

Guice和一般应用程序配置

对于用Java编写的监控软件,我考虑使用Google Guice作为DI提供程序.项目需要从外部资源(文件或数据库)加载其配置.该应用程序旨在以独立模式或servlet容器运行.

目前,配置不包含依赖项注入的绑定或参数,只有一些全局应用程序设置(JDBC连接定义和关联的数据库管理/监视对象).

我看到两个选择:

要么

  • 使用Guice -xml-config之类的Guice基于文件的插件来存储应用程序选项(如果有必要,这将允许稍后配置DI部分).

您是否建议将Guice用于这两项任务,或者将一般应用程序配置与依赖注入分开?您认为哪些优点和缺点最重要?

java configuration guice apache-commons-config

20
推荐指数
2
解决办法
2万
查看次数