程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了是否可以使用不完整的依赖树创建 Java Guice 依赖注入器?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决是否可以使用不完整的依赖树创建 Java Guice 依赖注入器??

开发过程中遇到是否可以使用不完整的依赖树创建 Java Guice 依赖注入器?的问题如何解决?下面主要结合日常开发的经验,给出你关于是否可以使用不完整的依赖树创建 Java Guice 依赖注入器?的解决方法建议,希望对你解决是否可以使用不完整的依赖树创建 Java Guice 依赖注入器?有所启发或帮助;

我能否让注入器稍后使用其提供程序并在 createChildInjector 之后请求? 举个例子:

class App {
  public static voID main(String[] args) {
    Injector injector = Guice.createInjector(new UserPropertIEs());
    User user = new User("Some name");
    injector.createChildInjector(new MyUserModule(user));
    String myname = injector.geTinstance(Key.get(String.class,names.named("Myname")));
    System.out.println(myName);
  }
}

@Value
class User {
  String name;
}

class UserPropertIEs extends AbstractModule {

  @ProvIDes
  @Singleton
  @named("Myname")
  public String myname(User user) {
    return user.getname();
  }

  // won't be used because we aren't interested Now in getTing TargetUser
  // List<User> Could also be in a separated module that get all users from database
  @ProvIDes
  @Singleton
  @named("TargetUser")
  public User targetname(@named("TargetUsername") String name,List<User> users) {
    return users.stream().filter(user -> user.getname().equals(Name)).findAny().get();
  }
}

@AllArgsConstructor
class MyUserModule extends AbstractModule {
  private final User user;

  @Singleton
  @ProvIDes
  public User user() {
    return user;
  }
}

@AllArgsConstructor
class TargetUserModule extends AbstractModule {
  private final String name;

  @ProvIDes
  @Singleton
  @named("TargetUsername")
  public String targetUsername() {
    return name;
  }
}

我认为 UserPropertIEs 模块知道如何根据目标用户名和用户列表提供目标用户是公平的,但我在此示例中的应用程序不需要目标用户,它只是想知道“我的名字”。

所以基本上,我想要一个模块,如果我的应用程序要求此信息,它会知道如何表现,但如果没有,它仍然能够编译和运行我提供的尽可能多的信息.

有意义吗?

解决方法

您可以使用 OptionalBinder (javadoC) 执行此操作:

import javax.inject.Qualifier;

/** Binding Annotation for the name (a String) of the current User. */
@Qualifier
@Target({ FIELD,PARAMETER,METHOD })
@Retention(RUNTIME)
@interface UserName {}

class App {
  public static void main(String[] args) {
    Injector injector = Guice.createInjector(new UserPropertymodule());
    User user = new User("Some Name");
    Injector childInjector = injector.createChildInjector(new MyUserModule(user));
    String myName = childInjector.geTinstance(Key.get(String.class,UserName.class));
    System.out.println(myName);
  }
}

@Value
class User {
  String name;
}

class UserPropertymodule extends AbstractModule {

  @Override
  protected void configure() {
     OptionalBinder.newOptionalBinder(binder(),User.class)
         .setDefault().toProvider(DefaultUserProvider.class);
  }

  @Provides @UserName String provideUserName(User user) {
    return user.getName();
  }
}

class DefaultUserProvider implements Provider<User> {
  @Override
  public User get() {
    // Called to get the default user
  }
}

@AllArgsConstructor
class MyUserModule extends AbstractModule {
  private final User user;

  @Override
  protected void configure() {
     OptionalBinder.newOptionalBinder(binder(),User.class)
         .setBinding().toInstance(user);
  }
}

注意事项:

  • 以上假设您的主模块可以提供默认值。如果不能,则需要注入 Optional<User>
  • 我修改了您的 @H_73_3@main() 方法以使用子注入器获取用户名,但您可以从任一注入器获取它
  • 我使用了绑定注释,因为与 @Named 相比,它的类型更安全(而且它允许添加 Javadoc)

大佬总结

以上是大佬教程为你收集整理的是否可以使用不完整的依赖树创建 Java Guice 依赖注入器?全部内容,希望文章能够帮你解决是否可以使用不完整的依赖树创建 Java Guice 依赖注入器?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。