【问题标题】:Injecting objects with Guice 3.0使用 Guice 3.0 注入对象
【发布时间】:2013-07-01 13:55:22
【问题描述】:

我刚开始使用 Guice,在理解 guice 的注入方式时遇到了麻烦。我对Spring很熟悉,但这似乎有点不同。

我有一个 DAO 类:

public class SomeDAO {
    @NotNull
    private DB db = null;

    public SomeDAO (String databaseName) throws Exception{
        xxxxxxxxxxxxxxxxxxxxxxxx
    }
}

我有一个控制器,比如说:

public class SomeController {
    private SomeDAO someDAO;
}

我应该如何在这里使用 guice 来注入 someDAO 对象?注意 SomeDAO 构造函数中的 databaseName 应该由 SomeController 提供。

谢谢。

【问题讨论】:

    标签: java dependency-injection inversion-of-control guice inject


    【解决方案1】:

    理想情况下,SomeController 不必知道数据库的名称。这将来自配置文件或您的应用程序上下文,您可以像这样注入您的 DAO:

    public class SomeController {
      private final SomeDAO someDAO;
    
      @Inject 
      SomeController(SomeDAO someDAO) {
        this.someDAO = someDAO;
      }
    }
    

    然后注入数据库名称,您可以执行以下操作:

    public class SomeDAO {
    
      @NotNull
      private DB db = null;
    
      @Inject
      public SomeDAO (@IndicatesDatabaseName String databaseName) throws Exception {
        ...
      }
    } 
    

    在这种情况下,Guice 将提供databaseName(请参阅https://code.google.com/p/google-guice/wiki/BindingAnnotations)。如果您想让控制器知道数据库名称,那么您可以考虑只从控制器中新建 DAO(但仍然注入控制器)或使用辅助注入。

    编辑:

    如果控制器真的需要知道你可以使用辅助注入的数据库:

    public class SomeController {
    
      private final SomeDAO someDAO;
    
      @Inject
      SomeController(@Assisted String databaseName) {
        this.someDAO = new SomeDAO(databaseName);
      }
    }
    
    public interface ControllerFactory {
      public SomeController create(String databaseName);
    }
    
    public static class MyModule extends AbstractModule {
      @Override
      protected void configure() {
        install(new FactoryModuleBuilder()
        .implement(SomeController.class, SomeController.class)
        .build(ControllerFactory.class));
      }
    }
    

    然后在需要SomeController 的地方注入ControllerFactory。如果 SomeDAO 最终需要更多注入依赖项,您也可以对它应用相同的辅助注入。

    【讨论】:

    • 谢谢...但是有几个数据库要连接,所以知识只有Controllers...所以需要将数据库名称传递给DAO层...您的意思是我只需要制作新的 SomeDAO("database")?在那种情况下,这不是 DI 模式,对吧?您能告诉我如何使用 Guice 以 DI 方式执行此操作吗?
    • 您的 DAO 如何连接到多个数据库?它们都具有相同的架构吗?添加了使用辅助注入的示例。在 DI 世界中使用 new 不一定是坏事——这取决于你的具体情况。如果只有控制器需要了解 DAO 并且 DAO 没有其他依赖项,那么请坚持使用new。如果其他客户端要实例化控制器,那么您也需要使用辅助注入。
    • 我正在使用 MongoDB,不太担心这个应用程序中的架构。
    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多