gpt4 book ai didi

Java IoC 和 Guice - 依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-01 11:41:49 25 4
gpt4 key购买 nike

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

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

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

// getter and setter
}

这个类,应该在其他几个 Controller 中使用:

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

这里我们只有一些需要 User 的示例,因此在第一个实例中 User 是一个单例,应该“存在”在整个应用程序中。

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

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

public class FirstComponent {
private User user;

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

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

更好的方法(我认为......)可以是将用户注入(inject)到所需的所有类中,而无需在创建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,例如:

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

很抱歉,如果我发布了一个愚蠢的问题,但是在网上查找时,我没有找到一些示例来解释如何解决这个问题。

我正在使用 Guice 进行查找,并且已经开始使用它了一点(非常少),但是问题还没有解决。

非常感谢您的帮助!

最佳答案

One simple approach could be to create all this three component to accept an User object and implement in this way:

public class FirstComponent {
private User user;

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

In this way, we need to create ALL the component after the user is setup, and not when they are needed.

事实并非如此。这种简单的方法就是依赖注入(inject)的全部内容。诀窍是为您的 User 对象选择正确的范围。

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

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

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

关于Java IoC 和 Guice - 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29469010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com