繁体   English   中英

Java IoC和Guice-依赖注入

[英]Java IoC and Guice - Dependency injection

抱歉,我对IoC和依赖注入感到有些困惑。 我会给你一个例子,说明我的想法,但是很难实现。

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

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

    // getter and setter
}

此类应在其他几个控制器中使用:

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

在这里,我们仅提供了一个需要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,并且已经开始使用它了(很少),但问题仍未解决。

非常感谢您的帮助!

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

public class FirstComponent {
  private User user;

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

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

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

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

问题在于,您可能最终会遇到大量的Singleton Objects,并且要避免创建可以指导创建对象的Builder类。

这样,创建过程便与类逻辑无关,并且类将更易于对模拟对象进行单元测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM