【问题标题】:Java IoC and Guice - Dependency injectionJava IoC 和 Guice - 依赖注入
【发布时间】:2015-04-06 09:59:04
【问题描述】:

很抱歉这篇文章,但我对 IoC 和依赖注入有点困惑。我会给你一个我想到的例子,但很难实现。

假设我有一个这样的类用户:

public class User {
    private String username;
    private String password;

    // getter and setter
}

这个类,应该用在其他几个控制器中:

  • 用户可以在其中更改密码的 UI
  • 用户可以提交一些“工作”的另一个 UI,此控制器需要访问用户名
  • 需要用户的任务(线程或其他东西)

这里我们只有一些需要 User 的例子,所以在第一个例子中,User 是一个单例,应该“活”在整个应用程序中。

在应用程序启动时(主)用户将被加载,但只会创建这三个控制器中的 一个。另一个组件将在应用程序运行时创建(并且发生某些事件)。

一种简单的方法是创建所有这三个组件以接受User 对象并以这种方式实现:

public class FirstComponent {
    private User user;

    public FirstComponent(User user) {
        this.user = user;
    }
}

这样,我们需要在用户设置好之后创建所有组件,而不是在需要时创建。

更好的方法(我认为...)可以在所有需要的类中注入用户,而不是“有义务”在创建 User 之后创建此组件:

public class FirstComponent {
    @Inject
    private User user;

    public FirstComponent() {
        // do something
    }
}

public class SecondComponent {
    @Inject
    private User user;

    public SecondComponent(int anArg ) {
        // do something
    }
}

我的问题是

  • 这可能是在大型应用程序中开发代码的一个很好的解决方案,这不仅是一个主类,还有几个其他 3/4 类?
  • 如何做到这一点,并避免 A 类依赖于 B 类?

在一个应用程序中,可以存在很多类如User,例如:

  • 具有约会列表的类 -> 这将被多个控制器共享

对不起,如果我发布了一个愚蠢的问题,但是在网上我没有找到一些解释如何解决这个问题的例子。

我正在寻找 Guice,我已经开始使用它一点(很少)但问题没有解决。

非常感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    一种简单的方法是创建所有这三个组件以接受用户对象并以这种方式实现:

    public class FirstComponent {
      private User user;
    
      public FirstComponent(User user) {
        this.user = user;
      }
    }
    

    这样,我们需要在用户设置好之后创建所有组件,而不是在需要时创建。

    那不是真的。这种简单的方法就是依赖注入的全部内容。诀窍是为您的User 对象选择正确的范围。

    基本上,每当您创建一个类并在某处编写new 时,将您想要创建的对象作为参数添加到构造函数中。一个例外是像ListArray 这样的容器。这样所有的依赖关系都消失了。

    问题是您最终可能会得到大量 Singleton 对象,为了避免这种情况,您可以创建引导对象创建方式的 Builder 类。

    这样,创建过程独立于类逻辑,并且类将更容易使用模拟对象进行单元测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      相关资源
      最近更新 更多