【问题标题】:Injecting a class depending on args根据 args 注入一个类
【发布时间】:2014-08-06 15:43:45
【问题描述】:

我需要使用 Guice 构造一个 ApplicationContext 实例。我的大多数其他类都依赖于 ApplicationContext。但是,ApplicationContext 依赖于 public static void main 中可用的 args 数组。

目前,我必须创建 ApplicationContext 并手动调用设置器,然后在要求 Guice 创建其他对象之前使用 injectMembers 将其注入。当 Guice 依赖于 args 时,是否有更好的方法让我的对象创建?

ApplicationContext appContext = new ApplicationContext();
// configure my appContext from command line args
injector.injectMembers(appContext);
MyAppFoo a = injector.getInstance(MyAppFoo.class);
a.doThings();

【问题讨论】:

    标签: java guice


    【解决方案1】:

    这是一种方法:

    class ApplicationContext {
        @Inject @Named("args") String[] args;
    }
    
    class MyAppFoo {
        @Inject ApplicationContext context;
    }
    
    class ApplicationModule extends AbstractModule {
        private final String[] args;
    
        ApplicationModule(String[] args) {
            this.args = args;
        }
    
        @Override
        protected void configure() {
            bind(String[].class)
                .annotatedWith(Names.named("args"))
                .toInstance(args);
    
            bind(ApplicationContext.class);
            bind(MyAppFoo.class);
        }
    }
    
    public class Application {
        public static void main(String[] args) {
            Injector injector = Guice.createInjector(new ApplicationModule(args));
            MyAppFoo a = injector.getInstance(MyAppFoo.class);
            a.doThings();
        }
    }
    

    【讨论】:

      【解决方案2】:

      你可以使用provider或者provider方法来构造ApplicationContext,并在它参与其他注入之前进行配置:

      public static void main(String[] args) {
      
          Injector injector = Guice.createInjector(b -> {
              b.bind(ApplicationContext.class).toProvider(() -> {
                  // construct and configure application context
                  ApplicationContext ctx = new ApplicationContext();
                  ctx.setSomething(args[0]);
                  ctx.setSomethingElse(args[1]);
                  return ctx;
              }).in(Singleton.class);
          });
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        • 1970-01-01
        • 2017-01-03
        • 1970-01-01
        • 2013-08-17
        • 2016-08-30
        • 2018-08-16
        相关资源
        最近更新 更多