sme*_*sme 13 dependency-injection guice
有些东西我只是不了解guice:根据我到目前为止所读到的内容,我应该只在我的bootstrapping类中使用Injector(在独立的应用程序中,这通常是在main()方法中) ,如下例所示(取自guice文档):
public static void main(String[] args) {
/*
* Guice.createInjector() takes your Modules, and returns a new Injector
* instance. Most applications will call this method exactly once, in their
* main() method.
*/
Injector injector = Guice.createInjector(new BillingModule());
/*
* Now that we've got the injector, we can build objects.
*/
RealBillingService billingService = injector.getInstance(RealBillingService.class);
...
}
Run Code Online (Sandbox Code Playgroud)
但是,如果不是所有我需要的对象都可以在启动期间创建?也许我想在应用程序运行时响应一些用户交互?我不是必须将我的注入器放在某处(例如作为静态变量),然后在需要创建新对象时调用injector.getInstance(SomeInterface.class)吗?
当然,在整个地方传播对Injector.getInstance()的调用似乎并不可取.
我在这里弄错了什么?
Gam*_*lor 13
是的,您基本上只应该使用Injector来创建获取根对象的实例.应用程序的其余部分不应触及Guice-Container.正如您所注意到的,您仍需要在需要时创建一些对象.有不同的方法可以做到这一点,每种方法都适合不同的需求.
注入提供 者提供者是Guice的接口.它允许您请求对象的新实例.该对象将使用Guice创建.例如.
class MyService{
private Provider<Transaction> transactionProvider;
public MainGui(Provider<Transaction> transactionProvider){
this.transactionProvider = transactionProvider;
}
public void actionStarted(){
Transaction transaction = transactionProvider.get();
}
Run Code Online (Sandbox Code Playgroud)
建造工厂 通常你需要某种工厂.该工厂使用一些注入的服务和一些参数,并为您创建一个新对象.然后,您将此工厂用于新实例.然后你注入那个工厂并使用它.使用AssistedInject -extension 也有帮助
我认为有了这两种可能性,你很少需要使用Guice-Injector本身.然而,有时仍然适合使用注射器本身.然后,您可以将Injector注入组件.
| 归档时间: |
|
| 查看次数: |
5777 次 |
| 最近记录: |