Java Guice IOC:手动(可选)创建单例
尝试开始使用Guice,并努力了解我的用例如何适合 我有一个命令行应用程序,它接受几个可选参数 比如说,我有一个工具显示客户的订单Java Guice IOC:手动(可选)创建单例,java,guice,Java,Guice,尝试开始使用Guice,并努力了解我的用例如何适合 我有一个命令行应用程序,它接受几个可选参数 比如说,我有一个工具显示客户的订单 order-tool display --customerId 123 显示ID为123的客户拥有的所有订单。现在,用户还可以指定用户名: order-tool display --customerName "Bob Smith" 但是查询订单的接口依赖于客户ID。因此,我们需要从客户名称映射到客户ID。为此,我们需要连接到客户API。因此,用户必须指定: o
order-tool display --customerId 123
显示ID为123的客户拥有的所有订单。现在,用户还可以指定用户名:
order-tool display --customerName "Bob Smith"
但是查询订单的接口依赖于客户ID。因此,我们需要从客户名称映射到客户ID。为此,我们需要连接到客户API。因此,用户必须指定:
order-tool display --customerName "Bob Smith" --customerApi "http://localhost:8080/customer"
启动应用程序时,我希望解析所有参数。在指定了--customerApi
的情况下,我想在我的IoC上下文中放置一个customerApi单例,该上下文由CLI参数和API URL参数化
然后,当代码运行以按名称显示客户时,它会询问上下文是否有CustomerApi单例。如果没有,它将抛出一个异常,告诉CLI用户如果要使用--customerName
,他们需要指定--customerApi
。但是,如果已经创建了一个,那么它只是从IoC上下文中检索它。听起来“选择性地创建一个单例”并不是您在这里想要做的。我是说,是的,但这很简单:
if (args.hasCustomerApi()) {
bind(CustomerApi.class).toInstance(new CustomerApi(args.getCustomerApi()));
}
要允许可选绑定,您可能需要
我认为您真正的问题是如何构造应用程序,以便您可以对其进行部分配置,使用配置来读取和验证一些命令行标志,然后使用这些标志来完成应用程序的配置。我认为最好的方法是使用儿童注射器
public static void main(String[] args) {
Injector injector = Guice.createInjector(new AModule(), new BModule(), ...);
Arguments arguments = injector.getInstance(ArgParser.class).parse(args);
validateArguments(arguments); // throw if required arguments are missing
Injector childInjector =
injector.createChildInjector(new ArgsModule(arguments));
childInjector.getInstance(Application.class).run();
}
就像普通的注入器一样,如果它们本身不包含给定的绑定,则遵从父注入器。您还可以在上阅读文档